2009-12-31 82 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