我正在Qt中编写一个应用程序(使用C ++),我需要在树视图中表示一个对象结构。其中一种方法是为此创建一个模型,但在阅读有关该主题的Qt文档后,我仍然感到很困惑。
我所拥有的“结构”非常简单 - 有Project
个对象在Task
容器中保存std::vector
个对象。这些任务也可以保存子任务。
我已经写过阅读和阅读方法使用Qt的XML类将这些项目写入XML文件或从XML文件中编写。
是否有更多文档或“推荐阅读”从头开始创建模型?你怎么建议我开始实现这个?
答案 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实例。
其次,考虑到结构清晰(正如您所看到的那样),编写parent
和index
函数非常容易。这里的关键是要理解模型根是一个未初始化的QModelIndex
实例。即QModelIndex::isValid() == false
表示root。
第三,如果你去多栏,请记住只有第一列有孩子。
第四,要检查您是否按预期方式执行操作,请使用ModelTest类。它监视并检查您的模型,以便您遵循Qt模型视图类所期望的约定。