2011-09-27 19 views
4

我有一個派生自QAbstractItemModel的工作樹模型,我希望使用QSortFilterProxyModel子類來過濾它,以僅顯示某些條件的子節點。比如我有下面的樹:如何使用QSortFilterProxyModel過濾僅與父母顯示子節點的樹模型?

A 
- B 
-- C1 
-- C1 
-- C1 
--- C2 
- D 
- E 

我想與該節點有名稱的條件來過濾此樹== C1和顯示只有C1和他們的孩子的節點是這樣的:

C1 
C1 
C1 
- C2 

我已經有filterAcceptsRow()子類中重新實現的,可以部分地做我想做的,但它仍然會顯示C1節點的父母和祖父母:

A 
- B 
-- C1 
-- C1 
-- C1 
--- C2 

我認爲這爲b因爲對於兒童節點甚至要考慮,他們的父母必須通過filterAcceptsRow()測試,對嗎?我怎樣才能實現filterAcceptRows()或其他方法,使它可以做我所描述的?

我在qtcentre和qtforum的某個時候問過這個問題,但沒有得到任何有用的答覆。我試圖直接使用filterAcceptsRow()中的beginMoveRows和endMoveRows移動QSortFilterProxyModel子類的索引,但由於危險的const_cast而導致測試應用程序崩潰。

+0

哇!真的沒有人能夠回答這個問題嗎? – ksming

回答

4

好的,我找到了解決我的問題的方法。只要使用索引爲B的QTreeView :: setRootIndex()作爲輸入參數。索引B成爲隱藏的QTreeView的根索引,並且只顯示其子項。

找到這個解決方案後,我覺得真的很愚蠢。猜測我太專注於使用代理模型來修改數據的呈現方式,我完全忘記了QTreeView。

1

我不認爲這是可能實現使用QSortFilterProxyModel。原因是這個類只對元素進行過濾 - 它根據給定的標準隱藏(或不)某些元素。你想要做的是將樹重新構建成新的(從根子的任意位置選擇元素)。這隻有通過創建自己的QProxyModel後代並實現自己的樹重建以及映射舊樹和新樹之間的索引來實現。

準確地描述如何做到這一點在這裏有一個答案有點長。

+0

在用QSortFilterProxyModel擺弄之後,我認爲你是對的。爲了不顯示不相關的父節點,創建我自己的QProxyModel似乎太麻煩了。我想我會活在現在有父節點​​,並且每當我重新加載我的模型時調用treeview :: expandAll(),以便立即顯示所有數據。 – ksming

相關問題