如何更正 QTreeView 上的 "expand/collapse" 图标?

How to correct the "expand/collapse" icon on the QTreeView?

当你看到这个展开图标的时候,你会认为文件夹下面有东西。但什么也没有。此问题会导致糟糕的用户体验。如何解决? (** 如果文件夹为空,则不会显示展开图标。)

我的代码基本上是这样的:

QFileSystemModel ---> QTreeView

edit3:

import sys
from PySide2.QtCore import *
from PySide2.QtWidgets import *

libPath = 'f:/tmp22'

# RUN ------------------------------------------------------------------
if __name__ == '__main__':
    app = QApplication(sys.argv)

    # data model ----------------------------------------------------------
    treeModel = QFileSystemModel()
    treeModel.setFilter(QDir.NoDotAndDotDot | QDir.Dirs)
    treeModel.setRootPath(libPath)

    # setup ui -------------------------------------------------------------
    treeView = QTreeView()
    treeView.setModel(treeModel)
    treeView.setRootIndex(treeModel.index(libPath))

    # show ui -------------------------------------------------------------
    treeView.show()
    sys.exit(app.exec_())

文件夹结构:

F:/tmp22
F:/tmp22/folder1    <-------- empty!
F:/tmp22/_folder2   <-------- empty!

QFileSystemModel 似乎认为一个文件夹总是有子文件夹,因此在这种情况下 hasChildren() returns 为 True。要更正此问题,如果文件夹不符合过滤器,则必须通过返回 false 来覆盖此方法。

import sys

# PySide2
from PySide2.QtCore import QDir, QSortFilterProxyModel
from PySide2.QtWidgets import QApplication, QFileSystemModel, QTreeView


libPath = 'f:/tmp22'


class FileSystemModel(QFileSystemModel):
    def hasChildren(self, parent):
        file_info = self.fileInfo(parent)
        _dir = QDir(file_info.absoluteFilePath())
        return bool(_dir.entryList(self.filter()))

# RUN ------------------------------------------------------------------
if __name__ == "__main__":
    app = QApplication(sys.argv)

    # data model ----------------------------------------------------------
    treeModel = FileSystemModel()
    treeModel.setFilter(QDir.NoDotAndDotDot | QDir.Dirs)
    treeModel.setRootPath(libPath)

    # setup ui -------------------------------------------------------------
    treeView = QTreeView()
    treeView.setModel(treeModel)
    treeView.setRootIndex(treeModel.index(libPath))

    # show ui -------------------------------------------------------------
    treeView.show()
    sys.exit(app.exec_())