2010-11-14 20 views
0

我有一個QTreeView,我希望篩選其中的內容。我只希望過濾頂級子級(即根目錄下的子級)的這些內容。目前我正在通過在我的QTreeView子類中創建一個簡單的過濾方法並選擇性地隱藏那些不匹配的行來完成此操作。QTreeView:篩選內容 - 尋找最佳實踐

雖然上面的方法似乎工作正常,我想知道是否應該重新實現這個使用QSortFilterProxyModel。如果是這樣,那麼優勢是什麼?

如果我改變使用QSortFilterProxyModel,我有幾個(希望小)問題:

1)因爲我在頂級兒童進行篩選,我將不得不重新實現任何方法是實際上是爲了讓所有的孫子獨自離開而進行分類,對吧?

2)我的數據模型有一些自定義的方法,它負責獨特的鍵盤導航等。我是否會在代理模型中重新實現這些模型,並讓它們指向我的數據模型的方法?如果是這樣,我如何參考模型?我似乎無法找到任何與QTreeView的model()方法相媲美的東西。

謝謝!

回答

0

使用QSortFilterProxyModel中的派生類更好。您保留在樹視圖外進行排序的責任。

以最大重用現有的代碼,您可以覆蓋filterAcceptsRow這樣

bool MySortFilterProxyModel::filterAcceptsRow(int sourceRow, 
    const QModelIndex &sourceParent) const 
{ 
    if(sourceParent.IsValid()) return true; // Don't filter other than top level 

    return QSortFilterProxyModel(sourceRow, sourceParent); 
} 

對於自定義方法,你將需要實現他們在您的代理。然後,爲了導航,您可能需要使用mapToSource和mapFromSource將代理索引轉換爲orignal模型索引