0

コンテンツをフィルタリングしたい QTreeView があります。これらのコンテンツを最上位の子 (ルート インデックスのすぐ下にある子) でのみフィルター処理したいと考えています。現在、QTreeView サブクラスで単純なフィルタリング メソッドを作成し、一致しない行を選択的に非表示にすることで、これを実現しています。

上記のアプローチはうまく機能しているように見えますが、QSortFilterProxyModel を使用してこれを再実装する必要があるかどうか疑問に思っています。もしそうなら、どのような利点がありますか?

QSortFilterProxyModel の使用に変更した場合、いくつかの (できれば小さな) 質問があります。

1)トップレベルの子のみをフィルタリングしているため、実際にソートを行っていたメソッドを再実装して、すべての孫をそのままにしておく必要がありますよね?

2) 私のデータ モデルには、独自のキーボード ナビゲーションなどを担当する多数のカスタム メソッドが含まれています。これらをプロキシ モデルに再実装し、データ モデルのメソッドを指すようにしますか? その場合、モデルを参照するにはどうすればよいですか? QTreeView の model() メソッドに相当するものを見つけることができないようです。

ありがとう!

4

1 に答える 1

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 を使用して、プロキシ インデックスを元のモデル インデックスに変換する必要がある場合があります。

于 2011-10-04T20:02:06.910 に答える