g2m.agent
g2m.agent

Reputation: 180

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.

Upvotes: 1

Views: 2865

Answers (1)

eyllanesc
eyllanesc

Reputation: 243955

  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

Upvotes: 2

Related Questions