Создание моделей Qt для древовидных представлений

Я пишу приложение в QtC++), и мне нужно представить структуру объекта в виде дерева. Один из способов сделать это-создать модель для этого, но я все еще в замешательстве после прочтения документации Qt на эту тему.

"структура" у меня довольно проста-есть

3 ответов


на QTreeView новички, основная проблема заключается в понимании index() и parent(). Недавно я написал об этом статью:

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

пример кода на Python, но принципы остаются теми же.


в качестве альтернативы тому, что сказал Вергилий, вы можете использовать QStandardItemModel - класс для вашей модели и просто построить дерево, Используя этот класс. Ниже приведен пример:

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);

надеюсь, это поможет, с уважением


основной трюк, чтобы получить эту работу, действительно, чтобы получить модель для отображения структуры данных. Что-то, что может показаться трудным, но не обязательно.

во-первых, с помощью помощью переопределенной QAbstractItemModel::значение createindex для построения индексов модели можно ссылаться на собственную структуру данных с помощью указателя или uint32, который можно добавить в индекс, в зависимости от того, какой экземпляр createIndex вы выберете для использования.

во-вторых, имея в виду структуру (как вы кажется, есть), это довольно легко написать parent и index функции. Ключевым моментом здесь является, чтобы понять, что корневой элемент модели является unintialized QModelIndex экземпляра. Т. е. QModelIndex::isValid() == false указывает на корень.

В-третьих, если вы идете в несколько столбцов, помните, что только в первом столбце есть дети.

В-четвертых, чтобы проверить, что вы делаете вещи правильно, не используйте ModelTest класса. Он отслеживает и проверяет вашу модель, чтобы вы следовали соглашениям, которые модель Qt вид занятий ожидать.