Reputation: 180
I want to make a manager that can display specific folders. suppose I want to filter out folders without extensions.
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
Reputation: 243955
setNameFilters()
only supports wildcards, not regex, so it fails.
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_())
Upvotes: 2