PyQt5/PySide2:如何按文件名過濾 QFileSystemModel 的文件列表?
我想做個能顯示特定文件夾的管理器,我只知道用特定的文件名來區別文件夾,如:
folder1.asset
folder2
_folder3
** 以上均為文件夾名
我希望能過濾掉帶 .asset 後綴的文件夾,但 QFileSystemModel.setNameFilters() 似乎只支持通配符,不支持正則表達式。
嘗試1:QFileSystemModel.setNameFilters()
from PySide2 import QtCore, QtUiTools, QtWidgets
from PySide2.QtGui import *
from shiboken2 import wrapInstance
... ...
class treeGui(QtCore.QObject):
def __init__(self, parent=getMayaWindow()):
super(treeGui, self).__init__(parent)
uiFilePath = "f:/tmp2/tree.ui" #File path to .UI file, exported from QT Designer
# load ui file
loader = QtUiTools.QUiLoader()
uifile = QtCore.QFile(uiFilePath)
uifile.open(QtCore.QFile.ReadOnly)
self.ui = loader.load(uifile, None)
uifile.close()
# 取得文件夾數據
path = 'f:/tmp2'
dirModel = QtWidgets.QFileSystemModel()
dirModel.setRootPath(path)
dirModel.setFilter(QtCore.QDir.NoDotAndDotDot | QtCore.QDir.Dirs) # filter: only dir, no file.
# 過濾文件夾
dirModel.setNameFilters(['*.asset']) # 通配符匹配有效,但不能反向選擇
#dirModel.setNameFilters(['(^.asset)$']) # <-------------------------- 正則表達式無效,不顯示任何東西
# 顯示文件夾列表
self.ui.treeView.setModel(dirModel)
self.ui.treeView.setRootIndex(dirModel.index(path))
self.ui.show()
treeGui()
稍後我做了點研究,似乎用 QSortFilterProxyModel 能實現更多功能。
嘗試2:QtCore.QSortFilterProxyModel()
from PySide2 import QtCore, QtUiTools, QtWidgets
from PySide2.QtGui import *
from shiboken2 import wrapInstance
... ...
class treeGui(QtCore.QObject):
def __init__(self, parent=getMayaWindow()):
super(treeGui, self).__init__(parent)
uiFilePath = "f:/tmp2/tree.ui" #File path to .UI file, exported from QT Designer
# load ui file
loader = QtUiTools.QUiLoader()
uifile = QtCore.QFile(uiFilePath)
uifile.open(QtCore.QFile.ReadOnly)
self.ui = loader.load(uifile, None)
uifile.close()
# 取得文件夾數據
path = 'f:/tmp2'
dirModel = QtWidgets.QFileSystemModel()
dirModel.setRootPath(path)
dirModel.setFilter(QtCore.QDir.NoDotAndDotDot | QtCore.QDir.Dirs) # filter: only dir, no file.
# 用專門的類處理文件夾數據
proxyModel = QtCore.QSortFilterProxyModel()
proxyModel.setSourceModel(dirModel)
proxyModel.setFilterRegExp("(^.asset)$") # <------ 如果不包含這句則顯示所有文件夾,有這句則什麽都不顯示。
# 顯示文件夾列表
self.ui.treeView.setModel(proxyModel)
root_index = model.index('f:/tmp2')
proxy_index = proxyModel.mapFromSource(root_index)
self.ui.treeView.setRootIndex(proxy_index)
self.ui.show()
treeGui()
我嘗試修改正則表達式,如改成 '^f',結果都一樣,文件夾列表是空的。為什麼??
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
能否詳細說明?官网的文檔都是針對c,大都看不懂,而且很多函數用法在pyqt都對不上
最直接的方法是:继承 QSortFilterProxyModel,然后重写 filterAcceptRows 函数