2015-03-18 59 views
1

過去幾周我一直在努力尋找解決方案。我現在已經承諾了一個方向,但我仍然不完全滿意我所提出的。現在純粹出於好奇和希望下一次更合適的解決方案來提問。如何讓多個QAbstractItemModel類保持同步

如何保持多個QAbstractItemModel類同步,這些類引用的是相同的源數據,但在樹視圖中以不同方式顯示?

使用模型/視圖的主要原因之一是保持多個視圖彼此同步。但是,如果我的每個視圖都需要在同一列顯示不同的數據,就我所知,我需要將我的模型劃分爲兩個不同的模型,這些模型具有不同的實現,然後將迎合每個獨特的視圖顯示相同的項目。

底層的源項目是相同的,但顯示的數據是不同的。也許標誌也不同,以便用戶只能在一個視圖中選擇頂層項目,然後只能在另一個視圖中選擇子項目。

我會盡力舉一個例子:

比方說我TreeItem有三個屬性:A,B,C。

我有兩個樹視圖:TreeView1,TreeView2。每個都有兩列。

爲TreeView1顯示數據如下:列1 - >一,列2 - >乙

TreeView2顯示數據如下:列1 - >一,列2 - > C^

我然後需要創建兩個不同的模型,一個用於TreeView1,一個用於TreeView2,併爲每個適當地覆蓋數據和標誌方法。

由於它們現在是不同的模型,即使它們都在後臺引用相同的TreeItem,它們也不再保持同步。每當我在TreeView1上更改數據時,我都必須手動調用TreeView2上的刷新,反之亦然。

考慮到column1或屬性a是可編輯的並允許用戶設置TreeItem的名稱。希望的行爲是在TreeView1中完成的編輯立即反映在TreeView2中。

我覺得我錯過了一些重要的設計模式或什麼時候接近這個。任何人都可以看到我出錯的地方並糾正我嗎?或者這是一個正確的解釋?

謝謝!

回答

1

一種方法是使用視圖模型。有一個QAbstractItemModel適配器到您的基礎數據模型。所有交互都必須通過該模型。當您需要進一步將數據調整爲視圖時,只需使用引用上述適配器的代理視圖模型類,然後重新格式化/調整視圖的數據。所有的視圖模型將自動同步。它們可以從QAbstractProxyModel派生,儘管這不是必須的。

做,如果數據的底層源並不提供改變通知既爲內容和用於結構的沒有其他辦法。如果底層的數據源提供了相關的通知,那麼也可能是從QAbstractItemModel開始:)

+0

有趣。我一直在計劃沿着這些線做一些事情(使用QSortFilterProxyModel),儘管只是根據視圖過濾掉某些項目。儘管如此,我仍然會重複基礎模型。聽起來就像我應該進一步研究代理模型以更好地理解它們。 – Mathieson 2015-03-18 21:33:30

+0

@Mathieson代理模型幾乎是一個沒有gui的視圖,而是一個模型API來代替gui。將代理看作是機器可讀的視圖,它同意機器可讀的API也是模型的API。 – 2015-03-18 22:08:43

+0

你有什麼好的資源可以鏈接到完成這個或一些良好實現的例子嗎?這是迄今爲止我所發現的關於這個主題的最好的報告http://imaginativethinking.ca/use-qt-qsortfilterproxymodel/ – Mathieson 2015-03-18 22:53:30