Search code examples
pythonpyqt5pyside2qfilesystemmodel

How to filter the file list of QFileSystemModel by file name?


I want to make a manager that can display specific folders. suppose I want to filter out folders without extensions.

enter image description here

Try 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
... ... 

Try 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
... ...

I tried to modify the Regular Expression, but the results were the same.


Solution

    1. setNameFilters() only supports wildcards, not regex, so it fails.

    2. Using this answer has implemented filtering the folders whose name you do not have extensions.

    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_())
    

    enter image description here