Seite 1 von 1

Aufbauen von mehreren Qtrees aus einer QTreeWidgetItemListe

Verfasst: 10. August 2010 13:38
von qrk123
Hallo,

Ich habe ein Menü, das aus 5 Bäumen besteht. In allen Bäumen kann man aus einer großen Liste Items auswählen, die man mit einem Haken markiert.
Nun soll es einen weiteren Baum geben, der mir nur die ausgewählten Elemente des jeweils aktuellen Baumes anzeigt.

Mein Ansatz war folgender, ich habe 5 Listen, die jeweils die TopLevelItems der unteren Menübäume enthalten. Wenn sich der aktuelle Auswahlbaum ändert, dann ändert sich auch der Baum, der mir dessen Auswahl zusammenfasst.
In dem Fall nehme ich meine Liste fülle sie in den leeren Baum und hänge dann nur die im anderen Baum markierten Elemente neu hinein.
Wenn sich die Auswahl des Baumes ändert, wird der erstellte Baum gelöscht und ich nehme wieder meine TopLevelItemsListe her um ihn erneut zu befüllen.

Problem ist, dass sich in dem Baum, der mir die Auswahl zusammenfasst nur Referenzen befinden, die sich also beim clearen des Baumes löschen und anschließend beim zweiten Versuch den Baum zu füllen eine Nullpointer Exeption hervorrufen, da meine anderen Listen leer sind.

Gibt es eine geschickte Art dieses Problem zu lösen ohne ständig massenweise neue Objekte zu erstellen und zu kopieren?

vielen Dank

Verfasst: 10. August 2010 15:24
von upsala
Nimm das QSortFilterProxyModel und filtere nach den Selektionen.

Verfasst: 10. August 2010 16:52
von qrk123
Hallo,

hab mir die doku da gerade mal zu angesehen. So ein Filter wird leider schwierig, da ich im Moment nicht mit Models arbeite, sondern alles dynamisch aus QWidgetItems aufbaue, da Models wohl nicht so dynamisch sind.
Ein weiteres Probem ist, dass ich nciht verstehe wie ich die abfrage nach dem checked stats in meinen Filter hinein bekomme. In der Doku finde ich leider nur ein Beispiel mit regular expressions.
Wäre schon ideal wenn ich nicht alles auf models umstellen müsste.

Danke

Verfasst: 10. August 2010 17:28
von upsala
Das QTreeWidget mit dem du arbeitest hat doch ein Model, mit dem man arbeiten kann. Die QTreeWidgetItems sind Items davon.

bool MySortFilterProxyModel::filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const {
return source_parent.data(Qt::CheckStateRole).toInt()==Checked;
}

Du solltest dich mal mehr mit den MVC-Konzept von Qt beschäftigen.

Verfasst: 11. August 2010 11:42
von qrk123
Ich glaube das ist so nicht anwendbar. Ich müsste aus 5 QTreeWidgets jeweils ein Model generieren und das dann gefiltert anzeigen. Das geht vielleicht noch, auch wenn ich grad nicht weiß wie. Aber nebenbei müssten noch zusätzliche Informationen und spalten eingefügt werden im neuen Baum.

Das geht auch schon so ohne Model. Mein Problem war bis jetzt aber immer, dass es sich nur um referenzen gehandelt hat und sich auch die anderen 5 Bäume verändert haben. Und wenn ich ein Model eines anderen Baumes nehme und filtere, dann ist es wohl wieder nur eine Referenz.

Werds jetzt doch mit Kopieren von Objekten versuchen. Aber danke für deine Hilfe.

Verfasst: 11. August 2010 12:59
von upsala
Das QTreeWidget hat doch schon ein Model:

Code: Alles auswählen

QAbstractItemModel * QAbstractItemView::model () const