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

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



因此,如何获取QSortFilterProxyModel仅过滤目录中的文件,而不过滤其驻留的目录?

最佳答案

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

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

10-06 13:19