我在使用QTreeView和QFileSystemModel过滤特定文件夹时遇到问题。
我将我的根QFileSystemModel设置为特定文件夹 - 这是有效的。但我想只显示包含.jpg
个文件的文件夹。这可能吗?
我过滤.jpg
个文件,但是我的QTreeView会显示所有文件夹,甚至是那些没有.jpg
个文件的文件夹。因此,如果用户尝试打开没有.jpg
文件的某个文件夹,则不会发生任何事情。
如何隐藏这些文件夹?
注意:下面是部分代码。
QStringList filterTypeFile;
filterTypeFile.append("*.jpg");
this->m_pModelTreeViewImage->setNameFilters(filterTypeFile);
this->m_pModelTreeViewImage->setNameFilterDisables(false);
this->ui->treeViewImages->setModel(this->m_pModelTreeViewImage);
答案 0 :(得分:3)
坏消息,我担心:如果你想要那种行为,你将不得不自己实施。文件系统读者只是没有设置为执行此类操作。
这也是有原因的。通常支持隐藏文件,因为它快速而简单 - 文件名与正则表达式匹配,或者不是。隐藏目录(或使它们无法打开 - 相同的差异)是非常棘手的。你不能只看目录名;你必须抓取文件系统,寻找可打开的文件。并且硬盘访问慢。想象一下,您的用户正在查看非常接近文件系统根目录的目录 - 您必须爬过所有内容。然后,如果过滤器发生了变化,你就必须再次完成。
还要考虑:已建立的模式是仅隐藏文件,而不是隐藏目录。这可能是上述技术难题的结果,但它已成为标准的UI行为。因此,如果用户遇到的文件系统查看器没有显示他们期望的所有文件夹(或者如果他们无法打开某些文件夹,看似随机),他们会假设某些内容碎。
那就是说,如果有充分的理由去做,你可以重新实现QFileSystemModel来做你想要的(或者,如果失败了,你当然可以得到一个AbstractModel子类,就像你所描述的那样)。您的用户会适应环境,特别是如果出现这种新行为的原因很充分。
祝你好运!答案 1 :(得分:-1)
你应该从QSortFilterProxyModel
派生并重新实现
virtual bool filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const
功能。像这样的东西
bool JPGFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
QFileSystemModel *fs = static_cast<QFileSystemModel*>(sourceModel());
QModelIndex i = fs->index(source_row, 0, source_parent);
bool accept=false;
if( fs->hasChildren(i) ){
for( int j=0; j<fs->rowCount(i); j++ )
if( fs->fileInfo(fs->index(j,0,i)).suffix()=="jpg" ){
accept=true;
break;
}
}
return accept;
}
我自己没试过。它很慢,但应该有用。