如何按文件名过滤 QFileSystemModel 的文件列表?
Posted
技术标签:
【中文标题】如何按文件名过滤 QFileSystemModel 的文件列表?【英文标题】:How to filter the file list of QFileSystemModel by file name? 【发布时间】:2019-06-17 07:56:59 【问题描述】:我想做一个可以显示特定文件夹的管理器。 假设我想过滤掉没有扩展名的文件夹。
尝试 1:QFileSystemModel.setNameFilters()
... ...
# get file data
path = 'f:/tmp2'
dirModel = QtWidgets.QFileSystemModel()
dirModel.setRootPath(path)
dirModel.setFilter(QtCore.QDir.NoDotAndDotDot | QtCore.QDir.Dirs)
# filter folders
dirModel.setNameFilters(['*.asset'])
# worked. but i want the opposite: that folders do not contain ".asset".
#dirModel.setNameFilters(['(^\.asset)$'])
# regular expression is not work. nothing shows up.
# show window
... ...
尝试 2:QtCore.QSortFilterProxyModel()
... ...
# get file data
path = 'f:/tmp2'
dirModel = QtWidgets.QFileSystemModel()
dirModel.setRootPath(path)
dirModel.setFilter(QtCore.QDir.NoDotAndDotDot | QtCore.QDir.Dirs)
# filter folders
proxyModel = QtCore.QSortFilterProxyModel()
proxyModel.setSourceModel(dirModel)
proxyModel.setFilterRegExp("(^\.asset)$") # if no this line, all folders are displayed; add this line, nothing shows up.
# show window
... ...
我尝试修改正则表达式,但结果是一样的。
【问题讨论】:
【参考方案1】:setNameFilters()
只支持通配符,不支持正则表达式,所以失败了。
使用this answer 已实现过滤名称您没有扩展名的文件夹。
import os
from PyQt5 import QtCore, QtGui, QtWidgets
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "56627022")
dirModel = QtWidgets.QFileSystemModel()
dirModel.setRootPath(QtCore.QDir.rootPath())
dirModel.setFilter(QtCore.QDir.NoDotAndDotDot | QtCore.QDir.Dirs)
view1 = QtWidgets.QTreeView()
view1.setModel(dirModel)
view1.setRootIndex(dirModel.index(path))
proxyModel = QtCore.QSortFilterProxyModel()
proxyModel.setSourceModel(dirModel)
proxyModel.setFilterRegExp(r"^([^.]+)$")
view2 = QtWidgets.QTreeView()
view2.setModel(proxyModel)
view2.setRootIndex(proxyModel.mapFromSource(dirModel.index(path)))
w = QtWidgets.QWidget()
hlay = QtWidgets.QHBoxLayout(w)
hlay.addWidget(view1)
hlay.addWidget(view2)
w.show()
sys.exit(app.exec_())
【讨论】:
以上是关于如何按文件名过滤 QFileSystemModel 的文件列表?的主要内容,如果未能解决你的问题,请参考以下文章
在 QFileSystemModel() 中列出文件的最佳方法?
如何在 Qt 中使用 QFileSystemModel 设置文本颜色 QTableView?
pyqt QFileSystemModel rowCount