Model / View "Lazy population" eines TreeViews (Konzept)
Verfasst: 25. August 2011 17:28
Hallo,
obwohl ich schon mehrere Tage mit Model/View rumspiele, stellt sich mir eine grundlegende Frage, wie man vom allgemeinen Ansatz folgendes Problem angehen sollte:
Ausgangslage
In einer SQL-Datenbank liegen ca. 30000 Datensätze. Jeder Datensatz ist später eine Zeile ein einem TreeView. Die Datensätze sind unsortiert aber es besteht zwischen diesen eine Hierarchie, die später auch im TreeView berücksichtigt werden soll. Diese Hierachie ist dadurch erkennbar, dass bei jedem Datensatz angegeben ist, wer sein Parent ist.
Gemachte Erfahrungen
Alle meine bislang gemachten Ansätze laden auf einmal alle 30000 Zeilen, was jedoch beim Aufbau der Tree-Hierarchie einfach zu lange dauert (ca. 2 min.). Da erscheint ein stückchenweiser Aufbau des TreeViews doch sinnvoller.
Konzeptionelle Überlegungen
Jeder Datensatz (=jede Zeile später im TreeView) wird einem Item entsprechend. Also werde ich hierfür QAbstractItemModel ableiten. Die Items werden jedoch erst dann erzeugt, wenn diese angezeigt werden sollen. Das wäre ja zunächst nur mal die erste Ebene. Erste Ebene = alle Parent-Items, die direkt am RootItem hängen; Aber halt. Ich muss doch bereits jetzt bei diesen Parent-Items anzeigen, ob man diese aufklappen kann. Also dann werde ich auch jetzt schon die zweite Ebene laden (=die Child's der ersten Parents). Klappt man nun ein Item der ersten Ebene auf, bekommt man die bereits geladenen Daten angezeigt und lädt dann zugleich von diesem Item die dritte Ebene. Das Spiel ging dann immer so weiter. Soviel zu meiner Theorie. Meine Frage: Total falscher Ansatz? Geht's eleganter? Wie machen es die Profis (zu denen ich definitiv nicht gehöre)?
Hier, dass Ganze nochmals grafisch dargestellt:
https://picasaweb.google.com/lh/photo/d ... directlink
(Achja... die Docu habe ich natürlich schon gewälzt. In der wird auch angegeben, dass fetchmore() / canfetchmore() / lazy population die Lösung ist ... wie diese aber selbst aus konzeptioneller Sicht am besten aussieht ... nun, dafür dieser Thread
obwohl ich schon mehrere Tage mit Model/View rumspiele, stellt sich mir eine grundlegende Frage, wie man vom allgemeinen Ansatz folgendes Problem angehen sollte:
Ausgangslage
In einer SQL-Datenbank liegen ca. 30000 Datensätze. Jeder Datensatz ist später eine Zeile ein einem TreeView. Die Datensätze sind unsortiert aber es besteht zwischen diesen eine Hierarchie, die später auch im TreeView berücksichtigt werden soll. Diese Hierachie ist dadurch erkennbar, dass bei jedem Datensatz angegeben ist, wer sein Parent ist.
Gemachte Erfahrungen
Alle meine bislang gemachten Ansätze laden auf einmal alle 30000 Zeilen, was jedoch beim Aufbau der Tree-Hierarchie einfach zu lange dauert (ca. 2 min.). Da erscheint ein stückchenweiser Aufbau des TreeViews doch sinnvoller.
Konzeptionelle Überlegungen
Jeder Datensatz (=jede Zeile später im TreeView) wird einem Item entsprechend. Also werde ich hierfür QAbstractItemModel ableiten. Die Items werden jedoch erst dann erzeugt, wenn diese angezeigt werden sollen. Das wäre ja zunächst nur mal die erste Ebene. Erste Ebene = alle Parent-Items, die direkt am RootItem hängen; Aber halt. Ich muss doch bereits jetzt bei diesen Parent-Items anzeigen, ob man diese aufklappen kann. Also dann werde ich auch jetzt schon die zweite Ebene laden (=die Child's der ersten Parents). Klappt man nun ein Item der ersten Ebene auf, bekommt man die bereits geladenen Daten angezeigt und lädt dann zugleich von diesem Item die dritte Ebene. Das Spiel ging dann immer so weiter. Soviel zu meiner Theorie. Meine Frage: Total falscher Ansatz? Geht's eleganter? Wie machen es die Profis (zu denen ich definitiv nicht gehöre)?
Hier, dass Ganze nochmals grafisch dargestellt:
https://picasaweb.google.com/lh/photo/d ... directlink
(Achja... die Docu habe ich natürlich schon gewälzt. In der wird auch angegeben, dass fetchmore() / canfetchmore() / lazy population die Lösung ist ... wie diese aber selbst aus konzeptioneller Sicht am besten aussieht ... nun, dafür dieser Thread