C++ 为树视图创建Qt模型

C++ 为树视图创建Qt模型,c++,model-view-controller,qt,model,models,C++,Model View Controller,Qt,Model,Models,我正在用Qt(用C++编写)编写一个应用程序,我需要在树视图中表示一个对象结构。实现这一点的方法之一是为此创建一个模型,但在阅读了有关该主题的Qt文档后,我仍然感到非常困惑 我的“结构”非常简单——有一个Project对象,它在std::vector容器中保存Task对象。这些任务也可以包含子任务 我已经编写了使用Qt的XML类在XML文件中读写这些项目的方法 是否有更多的文档或“推荐阅读”用于从头创建模型?您建议我如何开始实现它?作为维吉尔在对该问题的评论中所说的替代方案,您可以将类用于您的模

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

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

我已经编写了使用Qt的XML类在XML文件中读写这些项目的方法


是否有更多的文档或“推荐阅读”用于从头创建模型?您建议我如何开始实现它?

作为维吉尔在对该问题的评论中所说的替代方案,您可以将类用于您的模型,并使用该类构建树。以下是一个例子:

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(视图)时,删除
模型
。文件:


实现此功能的基本技巧是正确地将模型映射到数据结构。看起来很难,但不需要的东西

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

第二,清楚地记住结构(正如您所看到的),编写
父函数
索引
函数非常容易。这里的关键是要理解模型根是一个未初始化的
QModelIndex
实例。例如,
QModelIndex::isValid()==false
表示根

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


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

对模型体系结构的简单而漂亮的解释。非常感谢。谁拥有QStandardItemModel(model)和创建的QStandardItems?i、 e.当ui->treeView被销毁时,我是否应该手动删除模型和项目?@AAEM从QStandardItem[model]文档中不清楚,但appendRow似乎拥有项目的所有权(尝试两次追加第二个项目失败)。与所有其他
setModel
调用一样,视图不拥有模型的所有权(以便于共享)。最后必须删除模型。(通过valgrind和Qt 5.11.2验证)这对于简单的情况非常好。但是,假设您不能一次性构建模型(假设您将第一项添加到
invisibleRootItem
中,并向其中添加一些行(子节点),然后再执行其他操作(如解析树下更深层所需的数据)。然后您要继续。您必须检索已添加的节点。如何检索?您有两种方法:
findItems()
item()
。前者不是为这个目的而设计的,我发现它不可靠,后者接受
。如何在树中定位一个节点就足够了?当然文档中没有答案。来自未来的问候!10年后,这个答案为我节省了几个小时,如果不是几天的工作时间的话。谢谢reeView新手,主要的挑战是理解
index()
parent()
。我不久前写了一篇关于这一点的文章:示例代码是用Python编写的,但原则保持不变。