我在使用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);
发布于 2012-03-07 03:18:15
坏消息,我担心:如果你想要这样的行为,你将不得不自己实现它。文件系统读取器不是用来做这类事情的。
这也是有原因的。隐藏文件通常是受支持的,因为它既快速又简单--要么文件名匹配你的正则表达式,要么不匹配。隐藏目录(或者使它们不能打开--相同的区别)要复杂得多。您不能只查看目录名;您必须搜索文件系统,寻找可打开的文件。而且硬盘访问速度很慢。想象一下,您的用户正在查看一个非常接近文件系统根目录的目录--您必须遍历所有内容。然后,如果过滤器改变了,你必须重新做一次。
还要考虑:这种情况下的既定模式是只隐藏文件,而从不隐藏目录。这可能是由于上述技术困难造成的,但它已经成为标准的UI行为。因此,如果用户遇到一个文件系统查看器,它没有显示他们期望的所有文件夹(或者如果他们无法打开某些文件夹,似乎是随机的),他们就会认为有些东西坏了。
也就是说,如果有很好的理由这样做,您可能会重新实现QFileSystemModel来做您想做的事情(或者,如果做不到这一点,您肯定可以让AbstractModel子类按照您所描述的那样工作)。你的用户将会适应,特别是如果有一个很好的理由来解释新的行为。
祝好运!
发布于 2012-10-07 22:32:02
您应该从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;
}
我自己还没试过呢。它速度很慢,但应该可以工作。
https://stackoverflow.com/questions/9589530
复制相似问题