我正在用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