我正在用Qt编写应用程序(使用C++),我需要在树视图中表示一个对象结构。其中一种方法是为此创建一个模型,但在阅读有关该主题的Qt文档后,我仍然很困惑。为树视图创建Qt模型
我的“结构”非常简单 - 有一个Project
对象,它在std::vector
容器中容纳Task
对象。这些任务也可以承担儿童任务。
我已经编写了方法来读取&使用Qt的XML类将这些项目写入/从XML文件中。
有没有更多的文档或“建议阅读”从头开始创建模型?你如何建议我开始实施这个?
我正在用Qt编写应用程序(使用C++),我需要在树视图中表示一个对象结构。其中一种方法是为此创建一个模型,但在阅读有关该主题的Qt文档后,我仍然很困惑。为树视图创建Qt模型
我的“结构”非常简单 - 有一个Project
对象,它在std::vector
容器中容纳Task
对象。这些任务也可以承担儿童任务。
我已经编写了方法来读取&使用Qt的XML类将这些项目写入/从XML文件中。
有没有更多的文档或“建议阅读”从头开始创建模型?你如何建议我开始实施这个?
对于QTreeView
新手,主要挑战是了解index()
和parent()
。我写了一篇关于这个前一阵子:
http://www.hardcoded.net/articles/using_qtreeview_with_qabstractitemmodel.htm
的示例代码是在Python,但原则保持不变。
作为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);
希望这会有所帮助,至于
的基本技巧得到这个工作真的是让模型对数据结构的映射权。有些东西可能看起来很难,但不一定是。
首先,使用QAbstractItemModel::createIndex来构建模型索引,您可以通过可以添加到索引的指针或uint32引用您自己的数据结构,具体取决于您选择使用的createIndex实例。其次,考虑到结构清晰(如你所见),编写parent
和index
函数是相当容易的。这里的关键是理解模型根是一个未初始化的实例。即QModelIndex::isValid() == false
表示根。
第三,如果你走多列,记住只有第一列有孩子。
第四,要检查你是否按预期方式做事,请使用ModelTest类。它监视并检查你的模型,以便你遵循Qt模型视图类期望的约定。
模型架构的好和简单的解释。谢谢! – satishgoda 2016-09-21 05:17:24
维吉尔,这太棒了。我永远不会再推荐使用QStandardItemModels。 – andref 2010-01-04 17:37:48
谢谢维吉尔,我现在有一个干净,简单和可重用的树。 – 2012-11-09 21:03:58