我正在用 Qt(使用 C++)编写一个应用程序,我需要在树视图中表示一个对象结构。这样做的一种方法是为此创建一个模型,但是在阅读了有关该主题的 Qt 文档后,我仍然很困惑。
我拥有的“结构”非常简单——有一个Project
对象将Task
对象保存在std::vector
容器中。这些任务也可以包含子任务。
我已经编写了使用 Qt 的 XML 类从 XML 文件读取和写入这些项目的方法。
从头开始创建模型是否有更多文档或“推荐阅读”?你建议我如何开始实施这个?
我正在用 Qt(使用 C++)编写一个应用程序,我需要在树视图中表示一个对象结构。这样做的一种方法是为此创建一个模型,但是在阅读了有关该主题的 Qt 文档后,我仍然很困惑。
我拥有的“结构”非常简单——有一个Project
对象将Task
对象保存在std::vector
容器中。这些任务也可以包含子任务。
我已经编写了使用 Qt 的 XML 类从 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);
当 UI(视图)被销毁时,删除model
. 文档:
让这个工作的基本技巧是让模型正确地映射到数据结构。可能看起来很难,但不一定是的东西。
首先,使用QAbstractItemModel::createIndex构建模型索引,您可以通过可以添加到索引的指针或 uint32 引用您自己的数据结构,具体取决于您选择使用哪个 createIndex 实例。
其次,结构清晰(如您所见),编写parent
andindex
函数非常容易。这里的关键是要了解模型根是一个未初始化的QModelIndex
实例。即QModelIndex::isValid() == false
表示根。
第三,如果你去多列,记住只有第一列有孩子。
第四,要检查您是否按照预期的方式做事,请使用ModelTest类。它监视和检查您的模型,以便您遵循 Qt 模型视图类所期望的约定。