Я пишу приложение в QT (с C++), и я должен представить структуру объекта в структурном виде. Один из способов сделать это должно создать модель для этого, но я все еще вполне смущен после чтения спокойной документации о предмете.
"Структура", которую я имею, довольно проста - существует a Project
объект, который содержит Task
объекты в a std::vector
контейнер. Эти задачи могут также содержать дочерние задачи.
Я уже записал методы, чтобы прочитать и записать эти проекты в XML-файлы с помощью классов QT XML.
Есть ли еще, документация или "рекомендовала читать" для создания моделей с нуля? Как Вы рекомендуете, чтобы я начал реализовывать это?
В качестве альтернативы тому, что было сказано Virgil в комментарии к вопросу, вы можете использовать класс 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
. Ключевым моментом здесь является понимание того, что корень модели является неинициализированным экземпляром QModelIndex
. Т.е. QModelIndex::isValid() == false
указывает на корень.
В-третьих, если вы перейдете к мультистолбцу, помните, что только первый столбец имеет дочерние элементы.
Четвертое, чтобы проверить, что вы делаете ожидаемым образом, используйте класс ModelTest. Он отслеживает и проверяет вашу модель, так что вы следуете конвенциям, которые ожидают классы просмотра модели Qt.