Design von QAbstractTableModel
Verfasst: 8. August 2010 11:25
Hallo zusammen,
Ich arbeite mich gerade in Qt ein (C/C++) und habe mein erstes Programm 'fertiggestellt', aber jetzt wo es fertig ist, denke ich, dass ich das ganze falsch angegangen bin.
Zuerst erkläre ich kurz, was das Programm macht:
Ich habe eine SQLite-Datenbank, für die ich eine extra Klasse geschrieben habe um alle Einträge einer Tabelle abzufragen. Diese Klasse speichert die abgefragten Einträge in einem std::vector zwischen.
Diese Daten möchte ich vorerst in nur einer Tabelle darstellen, dazu habe ich eine Klasse geschrieben, die von QTableView erbt und eine, die von QAbstractTableModel erbt. Das TableModel bekommt die Adresse des std::vectors übergeben, sodass es lesenden (und leider auch schreibenden, aber das ließe sich ändern und ist in dem Fall kein Problem) Zugriff auf alle Elemente des vectors hat. Das TableView zeigt mit dem Model die Daten nun an. Klasse Sache... nur gibts ein kleineres Problem:
Es sollen noch manuell Einträge hinzugefügt werden können. Dazu gibt es einen Button und ein Dialog. Nach der Bestätigung des Dialogs wird der Eintrag in die SQLite-Datenbank geschrieben, er wird im vector gespeichert aber nicht in der Tabelle dargestellt. Besser gesagt: Es wird nicht sofort / nicht richtig angezeigt. Denn anfangs ist nur eine neue leere Zeile sichtbar.
Wie teile ich dem TableView möglichst einfach und elegant mit, dass eine neue Zeile hinzugefügt wurde und wieso geschieht das nicht automatisch?
Ich habe es mit beginInsertRows / endInsertRows gelöst, aber das ist doch eigentlich keine Lösung?! Ich finde sie zumindest echt nicht schön :-/...
Also: War es von Anfang an falsch, dem Model einfach die Adresse des vectors zu geben? Wäre es eventuell besser, eine Kopie des vectors zu erstellen, die das Model dann selbst verwaltet?
Ich würde auch gerne ohne QSqlxxxxx auskommen, da ich überlege das Programm erneut unter gtkmm zu schreiben, um beide Bibliotheken besser einschätzen zu können (bin neu in der Linux-Programmierung).
Bin mir jetzt nicht sicher, ob meine Frage verständlich ist und bitte schonmal um Entschuldigung, wenn es zu undeutlich beschrieben ist
...
Danke für eure Zeit
Ich arbeite mich gerade in Qt ein (C/C++) und habe mein erstes Programm 'fertiggestellt', aber jetzt wo es fertig ist, denke ich, dass ich das ganze falsch angegangen bin.
Zuerst erkläre ich kurz, was das Programm macht:
Ich habe eine SQLite-Datenbank, für die ich eine extra Klasse geschrieben habe um alle Einträge einer Tabelle abzufragen. Diese Klasse speichert die abgefragten Einträge in einem std::vector zwischen.
Diese Daten möchte ich vorerst in nur einer Tabelle darstellen, dazu habe ich eine Klasse geschrieben, die von QTableView erbt und eine, die von QAbstractTableModel erbt. Das TableModel bekommt die Adresse des std::vectors übergeben, sodass es lesenden (und leider auch schreibenden, aber das ließe sich ändern und ist in dem Fall kein Problem) Zugriff auf alle Elemente des vectors hat. Das TableView zeigt mit dem Model die Daten nun an. Klasse Sache... nur gibts ein kleineres Problem:
Es sollen noch manuell Einträge hinzugefügt werden können. Dazu gibt es einen Button und ein Dialog. Nach der Bestätigung des Dialogs wird der Eintrag in die SQLite-Datenbank geschrieben, er wird im vector gespeichert aber nicht in der Tabelle dargestellt. Besser gesagt: Es wird nicht sofort / nicht richtig angezeigt. Denn anfangs ist nur eine neue leere Zeile sichtbar.
Wie teile ich dem TableView möglichst einfach und elegant mit, dass eine neue Zeile hinzugefügt wurde und wieso geschieht das nicht automatisch?
Ich habe es mit beginInsertRows / endInsertRows gelöst, aber das ist doch eigentlich keine Lösung?! Ich finde sie zumindest echt nicht schön :-/...
Also: War es von Anfang an falsch, dem Model einfach die Adresse des vectors zu geben? Wäre es eventuell besser, eine Kopie des vectors zu erstellen, die das Model dann selbst verwaltet?
Ich würde auch gerne ohne QSqlxxxxx auskommen, da ich überlege das Programm erneut unter gtkmm zu schreiben, um beide Bibliotheken besser einschätzen zu können (bin neu in der Linux-Programmierung).
Bin mir jetzt nicht sicher, ob meine Frage verständlich ist und bitte schonmal um Entschuldigung, wenn es zu undeutlich beschrieben ist
Danke für eure Zeit