PyQt5/PySide2:如何按文件名過濾 QFileSystemModel 的文件列表?

发布于 2022-01-02 14:42:07 字数 2966 浏览 806 评论 2

我想做個能顯示特定文件夾的管理器,我只知道用特定的文件名來區別文件夾,如:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

别再吹冷风 2022-01-07 23:09:55

能否詳細說明?官网的文檔都是針對c,大都看不懂,而且很多函數用法在pyqt都對不上

情痴 2022-01-03 02:57:10

最直接的方法是:继承 QSortFilterProxyModel,然后重写 filterAcceptRows 函数

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文