将QSortFilterProxyModel与树模型一起使用

时间:2008-10-30 16:48:24

标签: qt model-view-controller qsortfilterproxymodel

我有一个QDirModel,其当前目录已设置。然后我有一个QListView,它应该显示该目录中的文件。这很好。

现在我想限制显示的文件,因此它只显示 png 文件(文件名以.png结尾)。问题是使用QSortFilterProxyModel并设置过滤器regexp也会尝试匹配文件的每个父级。根据文件:

  

对于分层模型,过滤器是   递归地应用于所有孩子。   如果父项不匹配   过滤器,它的孩子都不会   所示。

那么,如何让QSortFilterProxyModel仅过滤目录中的文件,而不是它所在的目录?

5 个答案:

答案 0 :(得分: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) ;
}

答案 1 :(得分:7)

我们遇到了类似的工作,并最终制作了我们自己的代理模型来进行过滤。但是,通过文档查看您想要的内容(这似乎是一种更常见的情况),我遇到了两种可能性。

  1. 您可以在QDirModel上设置名称过滤器并以此方式过滤。我不知道这是否会像您想要的那样工作,或者名称过滤器是否也适用于目录。这些文档很少见。
  2. 对QSortFilterProxyModel进行子类化并覆盖filterAcceptsRow函数。来自文档:
  3.   

    可以通过重新实现filterAcceptsRow()和filterAcceptsColumn()函数来实现自定义过滤行为。

    然后你可能会使用模型索引来检查索引项是目录(自动接受)还是文件(文件名过滤器)。

答案 2 :(得分:1)

派生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);
}

答案 3 :(得分:1)

从Qt 5.10开始,final SQLiteDatabase mydb = new MyDatabase(EndicActivity.this).getWritableDatabase(); final Cursor c = mydb.rawQuery("select * from conteudos", null); String title = ""; if (c.getCount() >= 10) { c.moveToPosition(9); title = c.getString(c.getColumnIndex("title")); } 可以选择递归过滤。换句话说,如果孩子匹配过滤器,则其父母也将可见。

签出QSortFilterProxyModel::recursiveFilteringEnabled

答案 4 :(得分:-2)

只需使用KRecursiveFilterProxyModel KDE API

中的KItemModels模型即可