为树视图创建Qt模型

Vee*_*eti 12 c++ model-view-controller qt model models

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

我所拥有的"结构"非常简单 - 有一个Project对象将Task对象保存在std::vector容器中.这些任务也可以保存子任务.

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

是否有更多文档或"推荐阅读"从头开始创建模型?你怎么建议我开始实现这个?

ser*_*nko 12

作为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);
Run Code Online (Sandbox Code Playgroud)

当UI(视图)被销毁时,删除model.文档:


e8j*_*han 6

实现这一目标的基本技巧实际上是使模型正确映射到数据结构。有些事情可能看起来很难,但不一定如此。

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

其次,头脑中结构清晰(正如您所看到的那样),编写parentindex函数就很容易了。这里的关键是要理解模型根是一个未初始化的QModelIndex实例。ieQModelIndex::isValid() == false表示根。

第三,如果您使用多列,请记住只有第一列有子项。

第四,要检查您是否按预期方式执行操作,请使用ModelTest类。它监视并检查您的模型,以便您遵循 Qt 模型视图类期望的约定。