Seite 1 von 1

Änderungen in View auswerten

Verfasst: 23. Dezember 2007 12:10
von D_ron
Hallo!

Ich habe ein Baumansicht die auf einem eigenen Modell basiert, abgeleitet von QAbstractItemModel.

Das Modell setzt sich aus dynamischen Daten zusammen, die bei Programmstart ausgelesen werden. Es gibt 4 unterschiedliche Typen von Items, das ganze ist wie folgt strukturiert:

rootItem
|__Produkt (1-n)
|__Artikel (1-n)
|___Typ (1-n)
|__Daten (1-n)

Die View ist editierbar für die Items Produkt, Artikel und Typ.
Es gibt auch bereits verschiedene States wie "neu", "geändert" und "gelöscht".

Diese Änderungen sollen dann wieder in die Datenbank zurückgeschrieben werden. Die Frage ist nur wie ich mir am besten merke, welche Daten geändert bzw. gelöscht wurden. Gelöschte Items sind ja nicht mehr im Originalmodell vorhanden, d.h. das Originalmodell welches die TreeView verwendet kann ich nicht nehmen.

Wie würdet Ihr das Umsetzen?

Grüsse!

Verfasst: 23. Dezember 2007 12:34
von marco
hallo,

vielleicht kannste dein model von QSqlTableModel ableiten? dort werden änderungen solange protokolliert bis ein submit() oder revert() erfolgt.
ansonsten würde ich dir raten, ein eigenes caching-model einzuführen.

im übrigen kann man das in einem QTreeView auch schön farbig kenntlich machen. viele leute fahren auf sowas ab.

Verfasst: 23. Dezember 2007 15:20
von upsala
Verwende in deinem Model eine eigene Role für Items zur Markierung welche Items gelöscht/geändert wurden. Und um nur 'nicht gelöschte' Items in deiner View anzuzeigen kannst du dann ja noch ein ProxyModel dazwischenschalten.

Verfasst: 23. Dezember 2007 17:39
von D_ron
Hallo upsala,

das mit der Role ist auch eine Idee, ich weiss nur nicht wie man eigene roles definiert. wo finde ich das in der doku??

Die data() methode frägt diese ab. Wenn also Qt::Displayrole kommt dann
hole ich mir das item der treeview und kann dann den "Status" (neu, geändert, gelöscht) abfragen. diese daten habe ich direkt an jedes item in der treeview gekapselt. für item == deleted gebe ich einfach nichts mehr zurück. geänderte und neue items erscheinen mit einer farblichen markierung in der treeview. somit habe ich eigentlich doch alles im originalmodell was ich später zum zurückschreiben brauche, nähmlich die items inkl. ihren status.

Verfasst: 23. Dezember 2007 17:49
von upsala

Code: Alles auswählen

bool QSortFilterProxyModel::filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const 
QVariant QAbstractItemModel::data ( const QModelIndex & index, int role = Qt::DisplayRole ) const
Roles