Как отфильтровать список файлов QFileSystemModel по имени файла? - PullRequest
1 голос
/ 17 июня 2019

Я хочу сделать менеджер, который может отображать определенные папки.Предположим, я хочу отфильтровать папки без расширений.

enter image description here

Попробуйте 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
... ... 

Попробуйте 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
... ...

Я пытался изменить регулярное выражение, но результаты были такими же.

1 Ответ

2 голосов
/ 17 июня 2019
  1. setNameFilters() поддерживает только символы подстановки, но не регулярное выражение, поэтому происходит сбой.

  2. Используя в этом ответе реализована фильтрация папок, имя которых у вас отсутствует 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

...