3

我在使用 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);
4

2 回答 2

4

恐怕坏消息:如果你想要那种行为,你将不得不自己实现这个。文件系统读取器只是没有设置为执行此类操作。

这也是有原因的。通常支持隐藏文件,因为它既快速又简单 - 文件名与您的正则表达式匹配或不匹配。隐藏目录(或使它们无法打开 - 相同的区别)要复杂得多。你不能只看目录名;你必须爬取文件系统,寻找可打开的文件。而且硬盘访问速度很。想象一下,您的用户正在查看一个非常靠近您的文件系统根目录的目录——您必须浏览所有内容。然后,如果过滤器改变了,你就必须重新做一遍。

还要考虑:为此建立的模式是只隐藏文件,从不隐藏目录。这可能是上述技术困难的结果,但它已成为标准的 UI 行为。因此,如果用户遇到文件系统查看器没有显示他们期望的所有文件夹(或者如果他们无法打开某些文件夹,似乎是随机的),他们会假设某些东西已经损坏。

也就是说,如果无论如何都有充分的理由这样做,您可能会重新实现 QFileSystemModel 来做您想做的事情(或者,如果做不到这一点,您当然可以让 AbstractModel 子类表现得像您所描述的那样)。您的用户会适应,特别是如果新行为有充分的理由。

祝你好运!

于 2012-03-06T19:18:15.207 回答
-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;
}

我自己没有试过这个。它很慢,但应该可以。

于 2012-10-07T14:32:01.553 回答