2009-12-31 4 views
10

Ich schreibe eine Anwendung in Qt (mit C++) und ich muss eine Objektstruktur in einer Strukturansicht darstellen. Eine Möglichkeit, dies zu tun, ist ein Modell dafür zu erstellen, aber ich bin immer noch ziemlich verwirrt, nachdem ich die Qt-Dokumentation über das Thema gelesen habe.Erstellen von Qt-Modellen für Baumansichten

Die "Struktur", die ich habe, ist ziemlich einfach - es gibt ein Project Objekt, das Task Objekte in einem std::vector Container enthält. Diese Aufgaben können auch untergeordnete Aufgaben enthalten.

Ich habe bereits geschrieben Methoden zu lesen & schreiben Sie diese Projekte zu/von XML-Dateien mit Qt XML-Klassen.

Gibt es weitere Dokumentation oder "empfohlenes Lesen" zum Erstellen von Modellen von Grund auf neu? Wie empfehlen Sie, dass ich mit der Umsetzung beginne?

Antwort

17

Für QTreeView Neulinge ist die größte Herausforderung mit Verständnis index() und parent(). Ich habe einen Artikel über das vor einer Weile geschrieben:

http://www.hardcoded.net/articles/using_qtreeview_with_qabstractitemmodel.htm

Der Beispielcode in Python ist, aber die Prinzipien bleiben die gleichen.

+0

Virgil, das ist fantastisch. Ich werde QStandardItemModels nie wieder empfehlen. – andref

+0

Danke Virgil, ich habe jetzt einen sauberen, einfachen und wiederverwendbaren Baum. –

9

als Alternative zu dem, was von Virgil gesagt wurde, könnten Sie QStandardItemModel Klasse für Ihr Modell verwenden und einfach Ihren Baum mit dieser Klasse bauen. Unten ist ein Beispiel:

QStandardItemModel* model = new QStandardItemModel(); 

QStandardItem* item0 = new QStandardItem(QIcon("test.png"), "1 first item"); 
QStandardItem* item1 = new QStandardItem(QIcon("test.png"), "2 second item"); 
QStandardItem* item3 = new QStandardItem(QIcon("test.png"), "3 third item"); 
QStandardItem* item4 = new QStandardItem("4 forth item"); 

model->appendRow(item0); 
item0->appendRow(item3); 
item0->appendRow(item4); 
model->appendRow(item1); 

ui->treeView->setModel(model); 

hoffe, das hilft, sieht

3

Der grundlegende Trick diese Funktion zu erhalten ist wirklich das Modell auf die Datenstruktur Mapping richtig zu machen. Etwas, das schwierig erscheinen mag, aber nicht sein muss.

Zunächst können Sie mit der QAbstractItemModel::createIndex Modellindizes erstellen. Sie können auf Ihre eigene Datenstruktur über den Zeiger oder uint32 verweisen, die Sie dem Index hinzufügen können, je nachdem, welche Instanz von createIndex Sie verwenden möchten.

Zweitens, die Struktur klar zu haben (wie Sie scheinen), ist es sehr einfach, die parent und index Funktionen zu schreiben. Der Schlüssel hier ist zu verstehen, dass der Modellstamm eine unidentifizierte QModelIndex Instanz ist. I.e. QModelIndex::isValid() == false zeigt root an.

Drittens, wenn Sie mehrspaltig gehen, denken Sie daran, dass nur die erste Spalte Kinder hat.

Viertens, um zu überprüfen, ob Sie die Dinge wie erwartet tun, verwenden Sie die Klasse ModelTest. Es überwacht und überprüft Ihr Modell, sodass Sie die Konventionen befolgen, die die Qt-Modellansichtsklassen erwarten.

+0

Schöne und einfache Erklärung der Modellarchitektur. Vielen Dank! – satishgoda