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

标签 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);

最佳答案

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

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

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

就是说,如果无论如何都有充分的理由这样做,您可能可以重新实现 QFileSystemModel 来执行您想要的操作(或者,如果失败,您当然可以让 AbstractModel 子类像您描述的那样运行)。您的用户会适应环境,尤其是在新行为有充分理由的情况下。

祝你好运!

关于qt - 如何使用 QTreeView 和 QFileSystemModel 只显示包含特定文件的文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9589530/

相关文章:

拖动结束时未调用 QTableView mouseRelease 事件,bug?

c++ - 隐藏那些没有过滤文件的文件夹

c++ - 如何设置QTreeView的起点目录?

python - 如何获取 QFileSystemModel 和 QTreeView 中的选定项目

Qt 鼠标移动事件未被事件过滤器捕获

c++ - 如何将位置 n 的 QList 拆分为新的 QList

c++ - 将类作为函数参数传递

c++ - QTreeView 中某些索引的自定义文本颜色

python - 没有 QLabel 的 QTreeView 中的超链接

linux - 无法在 Linux 中的 QFileSystemModel 中显示主目录之上的任何内容