Seite 1 von 2

Sliderwert und QLineEdit in Datenbank schreiben

Verfasst: 4. Mai 2010 17:18
von mister11
Hallo,ich habe arbeite gerade an einem Programm was 15 LineEdits und dazu gehörige Sliderwerte in eine SQLite Datenbank schreiben soll.
Dabei habe ich ein paar Probleme:

1. Wie bekomme ich die Sliderwerte in meine Variable die in die Datenbank geschrieben werden soll?
2. Warum funktionieren meine Buttons nicht?NIcht mal der Ende Button der das Programm schliessen soll.
3. Wie kann ich dem Programm sagen das er bei jedem start in der Datenbank eine neue Tabelle anlgegen soll?

Ich habe die Datein mal angehangen.Vielleicht kann mir jemand helfen damit ich weiterkomme.Danke.

Verfasst: 4. Mai 2010 17:25
von franzf
1) Indem du das value() des sliders nimmst und in ein QSqlQuery packst?
2) Das weiß nur Gott ;) Ohne Code kann man da absolut nix sagen.
3) Indem du es programmierst?
Schau dir die examples an, die der Qt-Installation beiliegen, da solltest du für fast alle deine Fragen (auch für zukünftige) eine Antwort samt Lösung finden.

// edit
sry, aber dass etwas angehängt ist sieht man nur wenn man eingeloggt ist...
Immer wieder das selbe :/

Verfasst: 4. Mai 2010 17:39
von franzf
Ich hab mir das jetzt etwas angeschaut. Du verwendest den Designer, erstellst aber dein "Eingabe" nicht indem du eine Instanz deiner Klasse erstellst, sondern direkt in main() mit setupUi().
Auch in der Klasse Eingabe verwendest du parallel zu dem ui auch eigene Widgets (Buttons usw.).

Arbeite dich erstmal ein, soll heißen Examples und Demos anschauen. Selber experimentieren ist schön und lustig führt aber (wie hier) in die Sackgasse.
Die Doku zu Qt ist wunderbar und umfangreich, da sollte man schnell Licht sehen.

Verfasst: 4. Mai 2010 23:32
von mister11
das habe ich probiert.mir ist nicht klar geworden wie man die designer datei implementiert oder das per klasse macht.
ausserdem habe ich die fragen gestellt weil ich keine lösung in der doku dazu gefunden habe.zum beispiel wie ich einzellne tabellen anlege beim programmstart, da ich zum beispiel nicht weiss wie ich die namen dafür generisch vergeben soll, anstatt zum beispiel "tabelle 1" zu schreiben.

meinen ganzen aufbau habe ich realisiert in dem ich die examples angeschaut habe.zum beispiel den sql examples und dem adressbuch.

könnets du mir eventuell zeigen wo ich widgets für buttons verwende?und wie ich sie integriere so dass sie funktioneiren?
ausserdem konnte ich den slider value() nicht in eine int variable packen,das gab fehler beim compilieren.

Verfasst: 5. Mai 2010 08:36
von franzf
Die SQL-Examples und das Adressbuch bringen dich aber nicht weiter, wenns um die Bedienung des Designers + Verwendung in deinem Programm geht.
http://doc.qt.nokia.com/4.6/designer-us ... -file.html
Du verwendest gerade eine Mischung aus dem "Direct Approach" und dem "Single Inheritance Approach". Und das geht halt einfach nicht gut.
Als Beispiel sei dir gleich examples/designer/calculatorform ans Herz gelegt, genau das willst du.
könnets du mir eventuell zeigen wo ich widgets für buttons verwende?
Wenn du mit dem Designer arbeitest dann baust du deine Widgets und Buttons natürlich da ein. Aber ich vermute dein Satz enthält einige Fehler, die einen korrekten Schluss auf den eigentlichen Inhalt nicht zulassen.
ausserdem konnte ich den slider value() nicht in eine int variable packen,das gab fehler beim compilieren.
Ich kann mir irgendwie nicht vorstellen, dass du den Wert deines Sliders nicht an eine int-Variable übergeben konntest. Der value() ist ja eben gerade ein int...
Und wenn es einen Fehler gibt sollte man den auch posten. Samt Code der den Fehler verursacht.
zum beispiel wie ich einzellne tabellen anlege beim programmstart, da ich zum beispiel nicht weiss wie ich die namen dafür generisch vergeben soll, anstatt zum beispiel "tabelle 1" zu schreiben.
Ist das dein Ernst? Das ist dein Programm, nur du weißt warum du pro Programmstart eine neue Tabelle anlegen willst. Und nur du weißt, wie du den jeweiligen Namen generieren kannst...
Wenn es nur am Zusammensetzen des Strings liegt:
http://doc.qt.nokia.com/4.6/qstring.html#operator-2b-eq
http://doc.qt.nokia.com/4.6/qstring.html#operator-2b-36
http://doc.qt.nokia.com/4.6/qstring.html#number

Verfasst: 5. Mai 2010 12:03
von mister11
danke.
das bringt mich jetzt erstmal weiter.
ich geh das die nächsten stunden durch und meld mich wenn es was neues gibt.

Verfasst: 9. Mai 2010 17:35
von mister11
Mein Ende Button geht jetzt.Leider geht das Speichern in die Datenbank nicht.der Button wird zwar ausgeführt und auch eine Datenbank angelegt,aber leider ist diese leer.Woran könnte das liegen?


Code: Alles auswählen

#include <QtGui>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QtSql>
#include "eingabe.h"
#include "ui_eingabe.h"
#include "connection.h"


Eingabe::Eingabe(QWidget *parent) :
    QWidget(parent)
{

    ui.setupUi(this);

    connect(ui.AttributeButton, SIGNAL(clicked()), this, SLOT(Attribute()));
    connect(ui.VideoButton, SIGNAL(clicked()), this, SLOT(Video()));
    connect(ui.EndeButton, SIGNAL(clicked()), this, SLOT(Ende()));

}

void Eingabe::Attribute()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("Eingabedatenbank.sqlite");
    //if (!db.open()) {
    //    QMessageBox::critical(0, qApp->tr("Cannot open database"),
    //        qApp->tr("Unable to establish a database connection.\n"
    //                 "This example needs SQLite support. Please read "
    //                 "the Qt SQL driver documentation for information how "
    //                 "to build it.\n\n"
    //                 "Click Cancel to exit."), QMessageBox::Cancel);
    //    return false;

    db.open();

    if(db.isOpen()){

        Attribut1 =  ui.AttributeLine->text();
        Attribut2 =  ui.AttributeLine_2->text();
        Attribut3 =  ui.AttributeLine_3->text();
        Attribut4 =  ui.AttributeLine_4->text();
        Attribut5 =  ui.AttributeLine_5->text();
        Attribut6 =  ui.AttributeLine_6->text();
        Attribut7 =  ui.AttributeLine_7->text();
        Attribut8 =  ui.AttributeLine_8->text();
        Attribut9 =  ui.AttributeLine_9->text();
        Attribut10 =  ui.AttributeLine_10->text();
        Attribut11 =  ui.AttributeLine_11->text();
        Attribut12 =  ui.AttributeLine_12->text();
        Attribut13 =  ui.AttributeLine_13->text();
        Attribut14 =  ui.AttributeLine_14->text();
        Attribut15 =  ui.AttributeLine_15->text();

        QSqlQuery query;
        query.exec("create table eingabe (id int primary key, "
                   "Attribut_1 varchar(50), Attribut_2 varchar(50), Attribut_3 varchar(50), Attribut_4 varchar(50), "
                   "Attribut_5 varchar(50), Attribut_6 varchar(50), Attribut_7 varchar(50), Attribut_8 varchar(50), "
                   "Attribut_9 varchar(50), Attribut_10 varchar(50), Attribut_11 varchar(50), Attribut_12 varchar(50), "
                   "Attribut_13 varchar(50), Attribut_14 varchar(50), Attribut_15 varchar(50)");
        query.exec("insert into eingabe values(1, 'Attribut1')");
        query.exec("insert into eingabe values(2, 'Attribut2')");
        query.exec("insert into eingabe values(3, 'Attribut3')");
        query.exec("insert into eingabe values(4, 'Attribut4')");
        query.exec("insert into eingabe values(5, 'Attribut5')");
        query.exec("insert into eingabe values(6, 'Attribut6')");
        query.exec("insert into eingabe values(7, 'Attribut7')");
        query.exec("insert into eingabe values(8, 'Attribut8')");
        query.exec("insert into eingabe values(9, 'Attribut9')");
        query.exec("insert into eingabe values(10, 'Attribut10'");
        query.exec("insert into eingabe values(11, 'Attribut11')");
        query.exec("insert into eingabe values(12, 'Attribut12')");
        query.exec("insert into eingabe values(13, 'Attribut13')");
        query.exec("insert into eingabe values(14, 'Attribut14')");
        query.exec("insert into eingabe values(15, 'Attribut15')");
    }
    else {
    QMessageBox::information( this, "Achtung", "Speichern fehlgeschlagen!" );
    }




    ui.AttributeLine->setReadOnly(true);
    ui.AttributeLine_2->setReadOnly(true);
    ui.AttributeLine_3->setReadOnly(true);
    ui.AttributeLine_4->setReadOnly(true);
    ui.AttributeLine_5->setReadOnly(true);
    ui.AttributeLine_6->setReadOnly(true);
    ui.AttributeLine_7->setReadOnly(true);
    ui.AttributeLine_8->setReadOnly(true);
    ui.AttributeLine_9->setReadOnly(true);
    ui.AttributeLine_10->setReadOnly(true);
    ui.AttributeLine_11->setReadOnly(true);
    ui.AttributeLine_12->setReadOnly(true);
    ui.AttributeLine_13->setReadOnly(true);
    ui.AttributeLine_14->setReadOnly(true);
    ui.AttributeLine_15->setReadOnly(true);

    ui.AttributeButton->setEnabled(false);
    ui.VideoButton->show();
    ui.EndeButton->show();

    db.close();
}[code]
[/code]

Verfasst: 9. Mai 2010 17:56
von franzf
Du kannst mal nach jedem exec() den lastError abfragen. Dann kommst du vllt. sogar drauf, dass bei dem ersten query noch ein ")" fehlt.

Verfasst: 21. Mai 2010 16:50
von mister11
Hi.Habs jetzt soweit wie ich es wollte bis auf zwei kleine Dinge:

1. Wie kann ich es erreichen das er mir bei jedem Button-Klick von Attribute eine neue Tabelle anlegt, deren Namen ich nicht vorher bestimme?
D.h von mir aus auch numerisch (1,2,3...).Im Moment heisst die Tabelle "Eingabe" ich möchte aber das bei jedem Buttondruck eine eigene für die Daten angelegt wird.
Ich hab leider keinen SQlite Code dafür gefunden.

2.Wie kann ich den Handler der Slider mit dem Designer anpassen?Da finde ich leider nichts, ausser wenn man den Slider per Code einfügt und dann den Stylesheet extra per Code dazu eingibt.Geht das auch im Designer direkt?Ich möcte einfach nur ein .png dafür einsetzen statt dem grauen Windows-Handler.

Verfasst: 21. Mai 2010 17:11
von franzf
1) google "SQL Tabelle anlegen" -> CREATE TABLE [...]
Und da muss man einen Tabellennamen angeben, und einen Namen kann man nur angeben, wenn man weiß wie er lautet. Um ein Namen erstellen kommst du also nicht rum. Warum soll denn bei jedem Click eine neue Tabelle erstellt werden?

2) Im Designer gibt es im property-editor einen Eintrag "stylesheet".

Verfasst: 21. Mai 2010 18:47
von mister11
Um für jeden Nutzer eine eigene Tabelle zu haben und die Daten zuordnen zu können(Ist so gewünscht).

Könnte man denn mit einer count-Funktion die enthaltenen Tabellen zählen?Dann könnte man ja sagen "ergebnis+1" als Namen nehmen.

Verfasst: 21. Mai 2010 18:54
von franzf
Jeder Nutzer hat einen Namen - vergibt doch den als Tabellennamen?

Verfasst: 21. Mai 2010 20:21
von Nvidia
oder du führst die globale variable int i; ein und lässt sie bei jeder neuen tabelle um eins hochzählen und benennst sie dann nach QString standart.append(i);

Verfasst: 21. Mai 2010 20:31
von franzf
Nvidia hat geschrieben:oder du führst die globale variable int i; ein und lässt sie bei jeder neuen tabelle um eins hochzählen und benennst sie dann nach QString standart.append(i);
Und bei Programmende wird die gelöscht, und muss irgendwie beim nächsten Programmstart wieder rekonstruiert werden - die fällige Prozedur kann man dann im Prinzip auch gleich bei jedem Button-click machen.
Jetzt könnte man natürlich die Variable via QSettings für den nächsten Programmstart konservieren. Problem: User löscht die config, oder gibt seine DB (ist ja nur ein File; praktisch) weiter -> Peng, es wird versucht, die existierenden Tabellen neu anzulegen...

Letzte und beste Lösung: Man legt sich in der DB eine Tabelle "config" o.Ä. an, in der man alles speichert, was für das Überleben der DB in anderen Umgebungen wichtig ist, wie etwa die Anzahl der User, evtl. auch einen Tabellenprefix/Basisnamen, wenn das der User auswählen können soll, usw. Ich hätte gehofft dass du darauf selber kommst. Aber egal ;)
Und natürlich liest man das NICHT am Anfang aus und speichert es in einer globalen Variable, sondern liest es bei jedem Anlegen aus und aktualisiert den Wert, um bei möglichen Crashs/Prozessabschüssen/... auch wirklich eine in sich konsistente Datenbank zu haben.

Verfasst: 21. Mai 2010 20:38
von Nvidia
sowas
int i=0;
void MethodeTableerstellen()
{
QString standartname("Standartname%0").arg(i);
QSqlQuery query("CREATE TABLE IF NOT EXISTS "+standartname+" (spalte1, spalte2, spalte3) ");
query.exec();
i++;
}
so hab ich das gemacht ;-)
ok wenn du die länger gebrauch, hab ich die auch in der datenbank mitgespeichert.