为树视图创建Qt模型

时间:2009-12-31 16:01:34

标签: c++ model-view-controller qt model models

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

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

我已经写过阅读和阅读方法使用Qt的XML类将这些项目写入XML文件或从XML文件中编写。

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

2 个答案:

答案 0 :(得分: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);

销毁用户界面(视图)时,请删除model。文档:

答案 1 :(得分:3)

实现这一目标的基本技巧是将模型正确地映射到数据结构。可能看起来很难的东西,但不一定是。

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

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

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

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