2009-12-31 84 views
10

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

我的“结构”非常简单 - 有一个Project对象,它在std::vector容器中容纳Task对象。这些任务也可以承担儿童任务。

我已经编写了方法来读取&使用Qt的XML类将这些项目写入/从XML文件中。

有没有更多的文档或“建议阅读”从头开始创建模型?你如何建议我开始实施这个?

回答

17

对于QTreeView新手,主要挑战是了解index()parent()。我写了一篇关于这个前一阵子:

http://www.hardcoded.net/articles/using_qtreeview_with_qabstractitemmodel.htm

的示例代码是在Python,但原则保持不变。

+0

维吉尔,这太棒了。我永远不会再推荐使用QStandardItemModels。 – andref 2010-01-04 17:37:48

+0

谢谢维吉尔,我现在有一个干净,简单和可重用的树。 – 2012-11-09 21:03:58

9

作为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); 

希望这会有所帮助,至于

3

的基本技巧得到这个工作真的是让模型对数据结构的映射权。有些东西可能看起来很难,但不一定是。

首先,使用QAbstractItemModel::createIndex来构建模型索引,您可以通过可以添加到索引的指针或uint32引用您自己的数据结构,具体取决于您选择使用的createIndex实例。其次,考虑到结构清晰(如你所见),编写parentindex函数是相当容易的。这里的关键是理解模型根是一个未初始化的实例。即QModelIndex::isValid() == false表示根。

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

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

+0

模型架构的好和简单的解释。谢谢! – satishgoda 2016-09-21 05:17:24