9

QDirModel現在のディレクトリが設定されています。次にQListView、そのディレクトリ内のファイルを表示するはずの があります。これはうまくいきます。

ここで、表示されるファイルを制限したいので、pngファイルのみを表示します (ファイル名は .png で終わります)。問題はQSortFilterProxyModel、フィルター正規表現を使用して設定すると、ファイルのすべての親も一致させようとすることです。ドキュメントによると:

階層モデルの場合、フィルターはすべての子に再帰的に適用されます。親アイテムがフィルターに一致しない場合、その子アイテムは表示されません。

QSortFilterProxyModelでは、ディレクトリ内のファイルのみをフィルタリングし、それが存在するディレクトリはフィルタリングしないようにするにはどうすればよいですか?

4

5 に答える 5

10

次の動作に興味がある私のような人々のために: 子がフィルターに一致する場合、その先祖は隠されるべきではありません:

bool MySortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex & source_parent) const
{
    // custom behaviour :
    if(filterRegExp().isEmpty()==false)
    {
        // get source-model index for current row
        QModelIndex source_index = sourceModel()->index(source_row, this->filterKeyColumn(), source_parent) ;
        if(source_index.isValid())
        {
            // if any of children matches the filter, then current index matches the filter as well
            int i, nb = sourceModel()->rowCount(source_index) ;
            for(i=0; i<nb; ++i)
            {
                if(filterAcceptsRow(i, source_index))
                {
                    return true ;
                }
            }
            // check current index itself :
            QString key = sourceModel()->data(source_index, filterRole()).toString();
            return key.contains(filterRegExp()) ;
        }
    }
    // parent call for initial behaviour
    return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent) ;
}
于 2012-06-06T09:45:04.107 に答える
7

私が働いている場所でも似たようなことに遭遇し、フィルタリングを行うための独自のプロキシ モデルを作成することになりました。ただし、必要なもののドキュメントを調べたところ (より一般的なケースのようです)、2 つの可能性が見つかりました。

  1. QDirModel に名前フィルターを設定して、そのようにフィルタリングできる場合があります。これが希望どおりに機能するかどうか、または名前フィルターがディレクトリにも適用されるかどうかはわかりません。これらに関するドキュメントはまばらです。
  2. QSortFilterProxyModel をサブクラス化し、filterAcceptsRow関数をオーバーライドします。ドキュメントから:

filterAcceptsRow() および filterAcceptsColumn() 関数を再実装することで、カスタム フィルタリング動作を実現できます。

次に、おそらくモデル インデックスを使用して、インデックス アイテムがディレクトリ (自動的に受け入れる) かファイル (ファイル名のフィルター) であるかを確認できます。

于 2008-10-31T15:41:08.250 に答える
6

Qt 5.10 以降、QSortFilterProxyModel再帰的にフィルタリングするオプションがあります。つまり、子がフィルタに一致すると、その親も表示されます。

QSortFilterProxyModel::recursiveFilteringEnabledを確認してください。

于 2019-03-07T18:41:45.573 に答える
2

qsortfilterproxymodel を派生させてから...

bool YourQSortFilterProxyModel::filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const
{
    if (source_parent == qobject_cast<QStandardItemModel*>(sourceModel())->invisibleRootItem()->index())
    {
        // always accept children of rootitem, since we want to filter their children 
        return true;
    }

    return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
}
于 2010-11-05T12:56:33.317 に答える
-1

KItemModels KDE APIのKRecursiveFilterProxyModelモデルを使用するだけです

于 2015-09-02T19:11:50.370 に答える