2010-02-01 46 views
2

我的問題是關於Qt及其QAbstractItemModel如何在QAbstractItemModel中爲QTreeView創建人工節點

我有一個字符串和雙打的地圖(std::map<stringclass, double>),我想在一個Qt小部件中呈現。雖然我可以使用QTableView,但我想利用這個事實,即地圖的按鍵形式爲「abc.def.ghi」,其中可以有多個字符串,可以以「abc.def」開頭,甚至更多以「abc」開頭。

所以我想建立一個樹數據模型呈現在QTreeView

(-) abc 
    |--(-)def  
      |--ghi 3.1415 
      |--jkl 42.0815 
    |--(+)pqr 
    |--(+)xyz 

std::map是樹,所有其他節點將是暫時的,auxillary葉片的關鍵項目構造以支持用戶便利的摺疊。

不幸的是,這些方法rowCountindexcolumnCount,並data有常量修飾語,所以我不能簡單地設置爲我QAbstractItemModel衍生物中一個標題auxillary數據結構,並改變那裏的數據結構。

這樣做的最佳做法是什麼?我是否應該在我的std::mapQAbstractItemModel之間設置另一個班級層,還是有更明智的方法來做到這一點?


編輯1:雖然示出和使用的QTreeView,所以auxillary節點可能被丟棄並重建的std::map可以改變。我的假設是,處理這個問題的最佳方式是重構QAbstractItemModel - 或者我應該簡單地將該模型丟棄並將新構造的模型分配給QTreeView?在這種情況下,我可以設置構造函數中的所有節點,而不會受到方法常量的困擾。

回答

3

我會解析地圖並基於它創建一個樹數據結構。確保在更改地圖時同步模型。 如果此同步步驟過於複雜,則可能需要將數據從頭開始保存在樹形結構中,並在必要時轉換爲地圖。

在模型函數中動態解析地圖對我來說似乎是一個壞主意,您希望這些函數儘可能快。

0

我不明白const修飾符是如何成爲問題的。

你想的時候rowCountindexcolumnCountdata方法被調用來修改什麼成員您QAbstractItemModel衍生物的?你可能很好地存儲了一個對你的地圖的引用,並計算它的一切。無需修改地圖本身來提取所需的信息(據我所知!)。

編輯後EDIT1和評論
如果地圖勢必進行修改,用它作爲自己的類的基本結構。 如果因爲模型的生命週期可能超過地圖而無法保留對地圖的引用,請使用智能指針來確保它不會發生。

+0

你說得對,我不需要並想改變'std :: map',但是如果我繼承'QAbstractItemModel'來添加私有成員(例如用於緩存輔助節點),我不能修改私有成員在這些方法中。而'std :: map'可能是'QTreeView'的生命週期,因此可能需要重構模型而不重構它。 – fawick 2010-02-01 11:12:27

+0

我明白了。但是如果你想重新構造模型,當你的std :: map初始化的時候,當沒有const問題的時候這樣做! – 2010-02-01 12:35:46

相關問題