当前位置:  开发笔记 > 编程语言 > 正文

将QSortFilterProxyModel与树模型一起使用

如何解决《将QSortFilterProxyModel与树模型一起使用》经验,为你挑选了2个好方法。

我有一个QDirModel当前目录设置.然后我有一个QListView应该显示该目录中的文件.这很好用.

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

对于分层模型,过滤器以递归方式应用于所有子项.如果父项与筛选器不匹配,则不会显示其子项.

那么,我如何QSortFilterProxyModel才能只过滤目录中的文件,而不是它所在的目录?



1> azf..:

对于像我这样对以下行为感兴趣的人:如果孩子匹配过滤器,则不应隐藏其祖先:

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; idata(source_index, filterRole()).toString();
            return key.contains(filterRegExp()) ;
        }
    }
    // parent call for initial behaviour
    return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent) ;
}



2> Caleb Huitt ..:

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

    您可以在QDirModel上设置名称过滤器并以这种方式过滤.我不知道这是否会像您想要的那样工作,或者名称过滤器是否也适用于目录.这些文档很少见.

    对QSortFilterProxyModel进行子类化并覆盖该filterAcceptsRow函数.从文档:

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

然后,您可以使用模型索引来检查索引项是目录(自动接受)还是文件(文件名过滤器).

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有