Seite 1 von 1

Speichern eines QTabelWidgets

Verfasst: 21. März 2010 14:41
von multimedial.de
Hallo,

ich habe ein QTableWidget in meiner Anwendung mit Daten, die vom User ausgefüllt werden (es ist eine Art Tagebuch mit einer Funktion zur Verfolgung eigener Ziele).

Nun suche ich nach einem guten Weg, die Inhalte der Tabelle in eine SQlite Datenbank zu speichern. Dabei kann die Tabelle eine beliebige Anzahl von Zeilen aufweisen, je nachdem wieviele Daten der Benutzer eingetragen hat.

Ich könnte dabei natürlich nach den Spalten vorgehen (pro Zeile gibt es im Moment nur 3), jedoch kann dieses Design sich später ändern (also 4 Spalten pro Zeile, etc.etc).

Auch würde ich gerne als Bonus-Feature später eine chronologische Auflistung haben wollen (nach dem Motto "Folgende Zeile(n) sind am 15. Januar 2010 hinzugefügt worden, diese am 21.2.2010 usw.usw").


Der Hintergrund ist der, dass jede Zeile eine Art Aufgabe darstellen kann, deren Erfüllung beliebig viel Zeit in Anspruch nehmen kann. Die Zeitdauer soll jedoch messbar und für den Benutzer nachvollziehbar sein ("Erlangung von Ziel A, eingegeben am 22.1.2010 hat etwa 60 Tage gedauert, und ist wie folgt verlaufen....")

Kann mir da jemand helfen? Ich wäre auch an mehreren Wegen der Speicherung interessiert, also etwa wie man am besten den Inhalt eines QTableWidgets in eine Datenbank ablegen kann, und dabei ein eventuell änderndes Layout beibehalten kann, ohne dass die Spalten verrutschen, und/oder wie man die Tabelle als Objekt serialisieren und als binäres Objekt speichern kann...

Das Ansprechen der Datenbank sowie der entsprechende INSERT-Befehl ist kein Problem, im Moment suche ich eher nach einer Schema-Beschreibung der Tabelle, die ich zusammen mit den Daten ablegen könnte.

Andererseits wäre auch schon ein Speicherformat nach kompletten Zeilen sehr hilfreich, nur wie packt man eine Zeile einer Tabelle in ein Feld in SQlite?

Für jeden Hinweis dankbar,

multimedial.de

Verfasst: 21. März 2010 15:32
von Marco812
Hi,

meinst Du evtl. etwas in der Richtung?

Code: Alles auswählen

 for (int row = 0; row < tableWidget->rowCount(); ++row) {
            QString cellValue = tableWidget->item(row, 0)->text();
           //....
}

Verfasst: 21. März 2010 15:49
von multimedial.de
danke für deine schnelle Antwort.

Ich weiss wohl schon, wie ich an die Inhalte der Tabelle komme, es ist auch weniger eine Frage in punkto Programmierung selber, sondern mehr der Datenstruktur und Datenorganisation.

Kann man etwa eine qTableWidget komplett als solches serialisieren oder abspeichern? Gibt es etwa eine Schema-Beschreibung analog zu HTML-Tags, die eine gnaze Tabelle beschreiben?

Ich suche halt nach einer möglichst eleganten und flexiblen Methode, den Inhalt einer ganzen Tabelle entweder zu speichern oder besser noch in eine SQLite Datenbank abzulegen.

Verfasst: 21. März 2010 16:40
von upsala
Nein, dafür gibt es nichts fertiges.

Verfasst: 21. März 2010 16:51
von multimedial.de
Hallo upsala,

gut, vielen Dank für diese Antwort.

Gibt es die Möglichkeit in Qt Objekte zu serialisieren? Wenn ja, gibt es eine Beschreibung irgendwo dafür?

Wie könnte eine zeilenweise Repräsentierung der Inhalte in einem Objekt etwa aussehen?

Gibt es die Möglichkeit in Qt, ein Array oder Objekt etwa in eine fest definierte String-Repräsentation umzuwandeln und zurück? Analog zur eval() Funktion in ActionScript etwa oder wie in PHP?

Verfasst: 21. März 2010 18:04
von upsala
Man könnte event.(!) mithilfe von QtScript etwas tricksen.

Aber: C++ ist im Gegensatz zu PHP & Co keine Scriptsprache und somit ist so etwas nur mit großem Aufwand möglich.

Verfasst: 22. März 2010 09:14
von jerry42
Morgen,

gibt es einen bestimmten Grund warum Du gerade QTableWidget benutzen willst?
Nimm doch die QTableView in Verbindung mit einem QSqlTableModel (o.ä.). Damit kannst Du dir quasi dein Datenbankschema anlegen und einfach nur deinem Model sagen, welche Tabelle es heranziehen soll. Somit bist Du relativ flexibel was spätere Änderungen in der Struktur der Tabelle angeht.
Vielleicht ist es genau das was Du suchst.

Schau Dir einfach mal foglendes an:
http://doc.trolltech.com/4.6/qtableview.html
http://doc.trolltech.com/4.6/qsqltablemodel.html
http://doc.trolltech.com/4.6/model-view ... mming.html

Verfasst: 22. März 2010 17:09
von multimedial.de
Hallo Jerry42,

vielen Dank für Deine Antwort.

Ja, das geht schon in die richtige Richtung...

Ich muss mir das dennoch nochmal genauer ansehen, weisst Du denn, ob man auch dynamisch Reihen in die Tabelle einfügen kann, und ob diese dann in die DB zurückgeschrieben werden beim QSQLTableModel?

Verfasst: 23. März 2010 12:19
von jerry42
ja du kannst einfach dem Model sagen, dass es eine neue Zeile einfügen soll, oder auch eine bestehene Zeile löschen soll.
Mit der EditStrategy des Models kannst Du dann bestimmen zu welchem Zeitpunkt die Daten zurück in die Datenbank geschrieben werden sollen (OnManualSubmit, OnRowSubmit, OnFieldSubmit).

Verfasst: 24. März 2010 09:37
von multimedial.de
Hallo Jerry42,

ich verstehe die Model/View Klassen zwar, aber mir fehlt ein konkretes Beispiel, wie man eine Datenbank an die Tabelle bindet.

Gibt es irgendwo ein Beispiel (unter den Links habe ich keines gefunden)?

Ich wäre daran interessiert, eine SQLite Datenbank an eine Tabellenansicht zu binden und editierbar zu machen...

Dankbar für jeden Hinweis,

multimedial.de

Verfasst: 24. März 2010 09:49
von drizzt
Es gibt doch Qt Demos zum Thema SQL.

Verfasst: 24. März 2010 10:06
von jerry42
hier ist ein Beispiel innerhalb der links von oben :)

http://doc.trolltech.com/4.6/qsqltablem ... ml#details