- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我有一个 TreeView ,如下所示;
#QTreeView widget
#Shows files in set directory
self.treeView = QtWidgets.QTreeView(self.centralWidget)
self.treeView.setSortingEnabled(True)
self.treeView.setObjectName("treeView")
self.horizontalLayout_4.addWidget(self.treeView)
self.file_model=QtWidgets.QFileSystemModel()
self.file_model.setRootPath('C:\My Stuff\Movies')
self.treeView.setModel(self.file_model)
self.treeView.setRootIndex(self.file_model.index('C:\My Stuff\Movies'))
self.treeView.setColumnWidth(0,275)
self.file_model.setNameFilters(self.filterList)
self.file_model.setNameFilterDisables(0)
如您所见,我有一个过滤器可以隐藏未通过过滤器的项目(例如 *.mkv),但是我的目录中有一些文件夹包含不符合过滤器要求的文件。该文件夹保留在我的 TreeView 中,即使它是空的,我如何删除这些空文件夹(请记住,当我应用允许显示文件夹中的文件的过滤器时,我需要能够显示这些文件夹。
我正在运行 PyQt5、Python 3.5、Windows 7。
最佳答案
我们有同样的问题,这就是我尝试解决问题的方式。
您需要继承 QSortFilterProxyModel
并覆盖 hasChildren
和 filterAcceptsRow
。
请注意,您需要调用子类QSortFilterProxyModel
的nameFilters,而不是调用
方法。QFileSystemModel
的setNameFilters
这是我基于上述实现最终得到的代码:
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class DirProxy(QSortFilterProxyModel):
nameFilters = ''
def __init__(self):
super().__init__()
self.dirModel = QFileSystemModel()
self.dirModel.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs | QDir.Files) # <- added QDir.Files to view all files
self.setSourceModel(self.dirModel)
def setNameFilters(self, filters):
if not isinstance(filters, (tuple, list)):
filters = [filters]
self.nameFilters = filters
self.invalidateFilter()
def hasChildren(self, parent):
sourceParent = self.mapToSource(parent)
if not self.dirModel.hasChildren(sourceParent):
return False
qdir = QDir(self.dirModel.filePath(sourceParent))
return bool(qdir.entryInfoList(qdir.NoDotAndDotDot|qdir.AllEntries|qdir.AllDirs))
def filterAcceptsRow(self, row, parent):
source = self.dirModel.index(row, 0, parent)
if source.isValid():
if self.dirModel.isDir(source):
qdir = QDir(self.dirModel.filePath(source))
if self.nameFilters:
qdir.setNameFilters(self.nameFilters)
return bool(qdir.entryInfoList(qdir.NoDotAndDotDot|qdir.AllEntries|qdir.AllDirs))
elif self.nameFilters: # <- index refers to a file
qdir = QDir(self.dirModel.filePath(source))
return qdir.match(self.nameFilters, self.dirModel.fileName(source)) # <- returns true if the file matches the nameFilters
return True
class Test(QWidget):
def __init__(self):
super().__init__()
self.dirProxy = DirProxy()
self.dirProxy.dirModel.directoryLoaded.connect(lambda : self.treeView.expandAll())
self.dirProxy.setNameFilters(['*.ai']) # <- filtering all files and folders with "*.ai"
self.dirProxy.dirModel.setRootPath(r"<Dir>")
self.treeView = QTreeView()
self.treeView.setModel(self.dirProxy)
root_index = self.dirProxy.dirModel.index(r"<Dir>")
proxy_index = self.dirProxy.mapFromSource(root_index)
self.treeView.setRootIndex(proxy_index)
self.treeView.show()
app = QApplication(sys.argv)
ex = Test()
sys.exit(app.exec_())
这是我所做的测试,结果对我来说还不错:
请阅读this question了解更多信息。
关于python - 隐藏空的父文件夹 QTreeView/QFileSystemModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38609516/
我正在寻找的几乎与 QFileSystemModel::setNameFilters() 相反。我想设置过滤器来捕获我不想显示的内容,但让其他所有内容通过。我看不出有什么方法可以遍历和隐藏某些文件,因
我可以扩展 QFileSystemModel 并添加带有文本/图标的新列吗? 问候 最佳答案 我将从子类化模型开始,提供额外的列并向其提供数据。 所以至少我会在这两种情况下重新实现 columnCou
我正在使用带有 QListview 的 QFileSystemModel 来显示目录中的所有文件。我想过滤该模型以显示某些类别的文件,例如: 文本文件:*.txt *.csv *.tab 音乐:*.m
我可以扩展 QFileSystemModel 并添加带有文本/图标的新列吗? 问候 最佳答案 我将从子类化模型开始,提供额外的列并向其提供数据。 所以至少我会在这两种情况下重新实现 columnCou
我正在使用以下过滤器设置我的 QFileSystemModel: QDir::Filters( Dirs|AllDirs|Files|Drives|NoDotAndDotDot|AllEntries
我正在尝试创建一个文件资源管理器,您可以在其中查找文件。找到后,用户应该能够选择他要上传的文件。因此我需要所选文件的路径。 这是我当前的代码: import sys from PyQt4.QtGui
在我的项目中,我有一个 QTreeView 显示我的驱动器上的一个位置。我需要将文件的所有图标更改为自定义图标,但不要管文件夹。 我重新实现了 QFileSystemModel,并且能够更改所有图标。
我正在尝试创建一个显示文件夹内容的 Qt 应用程序(在 Mac OS 中为“Users”文件夹)。这是代码: QFileSystemModel *dirModel = new QFileSystemM
如何像在 QDirModel 中那样使用 QDir::DirsFirst 对 QFileSystemModel 进行排序?QFileSystemModel 没有setSorting 方法。 最佳答案
所以我有一个 TreeView ,如下所示; #QTreeView widget #Shows files in set directory self.treeView = Q
我正在开始 Qt/pySide 编程,并试图实现一个简单的 QListView,以 QFileSystemModel 作为模型。我有这个工作,另外在模型上定义了一个名称过滤器。我想获得 QListVi
我正在尝试使用 QFileSystemModel 和 QTableView 制作一个小文件浏览器。 我想知道是否可以在“修改日期”列中突出显示具有相同值的行,例如,如果我今天修改了两个或多个文件,行以
是否可以使用 QFileSystemModel只列出一个目录内容而不是我计算机中的所有驱动器(在 Windows 中)? 最佳答案 这将是您的 View 的功能,而不是您的模型: http://doc
我正在 qt 中为一些自定义设计文件制作一个文件浏览器。我想将它们的预览加载为缩略图,因此我使用 QIconProvider 将图标返回到我的 QFileSystemModel。 问题是创建 QIco
您好,我已经编写了这段基本代码,试图填充 /Users/ 目录下的文件夹,但我不知道我错过了什么,它没有填充。 import sys from PyQt4 import QtGui from PyQt
首先,这个问题与另一个问题类似QFileSystemModel not updating when files change与本例的主要区别是,我不想每次更新我的文件之一时都替换整个模型。 在现实世界
通过环顾四周,我发现 QFileSysetmModel 中的 QFileIconProvider 会大大减慢速度。在我的特殊情况下,我根本不需要它,但我不知道如何轻松地禁用/删除它而不导致崩溃。这是我
我使用 QFileSystemModel 通过 QTreView 表示文件结构。一切正常,但我需要在树的某个级别添加额外的行。例如现在是: -根 --row1 --row2 --row3 所有这些行从
我遇到 QFileSystemModel 无法显示文件更改的问题。当文件第一次创建时,它会立即显示出来。但是当文件本身发生变化时,大小和时间戳不会更新。我已经多次尝试强制模型更新,但没有真正成功。我所
我有一个 QFileSystemModel 用作 QTreeView 中的模型。这个工作正常,现在我有一些目录的名称。我想将其隐藏在 QTreeview 中。 QString strCompleteD
我是一名优秀的程序员,十分优秀!