Qt-Modell-Baum-Ansicht und Tabellen-Ansicht
Habe ich eine Liste von Product-Objekten ( als Zeilen ), jedes Objekt hat mehrere Datenfelder ( wie Produkt-id, Produkt, Familie, etc ) - als Spalten. Ich es geschafft, eine Tabelle erstellen, Modell Unterklassen QAbstractTableModel, und die Anzeige der Daten in einem QTableView.
Was ich will, ist eine "gruppierte" Ansicht des Modells, die in einer baumartigen Struktur. Zum Beispiel möchte ich die Gruppe der Produkte, die von Ihrer Familie id, so sollte der Baum enthält in der ersten Ebene der Gruppen ( family id ) und Ihre Kinder sind das Produkt, dass die Familie id.
Irgendwelche Ideen?
PS:
Die Notwendigkeit von mehreren Gruppierungen ( group by-Familie-id, und gruppieren Sie Sie durch eine andere Spalte, und so weiter ) die mir zeigt, dass das Modell sollte ein Baum sein. Der root-Knoten gibt die Gruppen und dann die childs sind die Mitglieder der Gruppe. Die mehrfache Gruppierung kann erreicht werden, indem multi-level-Bäume.
Dann meine transformiert Frage ist folgende: Wie kann ich die implementieren eine spezielle Klasse QTableView, die zeigt nur der Baum die Blätter ( auf einer bestimmten Ebene )? ( Denn eigentlich Blätter sind die realen Objekte, die wir würde gerne sehen, in einem Gitter )
Kann ich verwenden setRootIndex in der tableview, aber es ist für nichts eine Lösung, andere Blätter werden nicht angezeigt.
Drang ich ein wenig und fand heraus, dass in QTableView::paintEvent, beim anzeigen jeder Zeile und Spalte, der eigentliche Punkt ist geholt wie :
const QModelIndex index = d->model->index(row, col, d->root);
wo d->root() ist der root-Knoten gegeben durch setRootIndex(). Dies sollte eingebettet sein in eine Baum-traversal-code, und alles wäre in Ordnung. Aber wie könnte ich es vermeiden, implementieren Sie die ganze paintEvent-Methode ?
- Wollt Ihr immer, dass Sie gruppiert die gleiche Weise (wie in der, von der Familie-id), oder wollen Sie die Gruppierung zu ändern, wenn Sie die Sortierreihenfolge ändern? Das erste sollte ziemlich einfach sein, die zweite nicht so viel.
- Habe ich eine einfache Baum-Modell, und legen Sie es für verschiedene Ansichten. Das Beispiel unten zeigt, wie ich möchte sehen, wie die Baum-Ansicht, aber in der Tabelle würde ich die Produkte, nicht die Familien. Wie kann ich einstellen, dass die Tabelle-Ansicht sieht die zweite Ebene Knoten des Modells? Der code kann hier gefunden werden : stud.u-szeged.hu/Veress.Krisztian/main.cpp
- wenn Sie buchen Sie Ihren code hier ein, es wird durchsuchbar und für alle zu sehen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Je nachdem, wie viel Anpassung Sie möchten die QTreeWidget sein könnte, der einfachste Weg, aber wenn du schon ein Modell, es hängt davon ab, auf denen Sie abgeleitet aus der. Man die Funktionalität, die Sie möchten, müssen Sie die untergeordneten Strukturen, um die Zeilen, die Sie bereits aufgebaut. Sie könnten es verpasst haben, aber die 'QModelIndex' Klasse hat einen 'parent' - Feld, das hilft, den Aufbau einer hierarchischen Struktur.
Werden Sie wahrscheinlich gut bedient, indem die
QStandardItem
undQStandardItemModel
Klassen. Diese haben eine anständige Schnittstelle zum Aufbau einer Baumstruktur, je nachdem, welche Daten Sie benötigen, um anzuzeigen, jede Ebene in der Hierarchie können Sie eine unterschiedliche Anzahl von Spalten und es gibt keine Begrenzung für die Tiefe.Wenn Sie abenteuerlustig fühlen, können Sie es von Anfang an und einfach umzusetzen
QAbstractItemModel
interface, aber das kann hart sein, um richtig zu machen manchmal.Generell denke ich, dass dies eines der seltsamsten Konzepte von QT, da die Menge der dimenionalities, die in der QAbstractItemModel (Zeilen, Spalten, Eltern/Kind-und-Rollen)
Beispielsweise
Disclaimer: diese wurde nicht kompiliert ...
Aber wie Sie sehen können, müssen Sie die Kinder auf das Element, und nicht das Modell, jeder Artikel kann enthalten eine Hierarchie von Elementen.