15

我正在用 Qt(使用 C++)编写一个应用程序,我需要在树视图中表示一个对象结构。这样做的一种方法是为此创建一个模型,但是在阅读了有关该主题的 Qt 文档后,我仍然很困惑。

我拥有的“结构”非常简单——有一个Project对象将Task对象保存在std::vector容器中。这些任务也可以包含子任务。

我已经编写了使用 Qt 的 XML 类从 XML 文件读取和写入这些项目的方法。

从头开始创建模型是否有更多文档或“推荐阅读”?你建议我如何开始实施这个?

4

2 回答 2

18

作为 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. 文档:

于 2009-12-31T18:09:35.133 回答
4

让这个工作的基本技巧是让模型正确地映射到数据结构。可能看起来很难,但不一定是的东西。

首先,使用QAbstractItemModel::createIndex构建模型索引,您可以通过可以添加到索引的指针或 uint32 引用您自己的数据结构,具体取决于您选择使用哪个 createIndex 实例。

其次,结构清晰(如您所见),编写parentandindex函数非常容易。这里的关键是要了解模型根是一个未初始化的QModelIndex实例。即QModelIndex::isValid() == false表示根。

第三,如果你去多列,记住只有第一列有孩子。

第四,要检查您是否按照预期的方式做事,请使用ModelTest类。它监视和检查您的模型,以便您遵循 Qt 模型视图类所期望的约定。

于 2010-01-01T09:21:24.833 回答