如何使用QTreeView和QFileSystemModel仅显示包含特定文件的文件夹?

时间:2012-03-06 18:17:01

标签: qt qtreeview qfilesystemmodel

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

2 个答案:

答案 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;
}

我自己没试过。它很慢,但应该有用。