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

是哦為 发布于 06/16 03:20
阅读 66
收藏 0

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

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',結果都一樣,文件夾列表是空的。為什麼??

加载中
0
東條・スペンサー・咲
東條・スペンサー・咲

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

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