如何在 PySide 的 QTreeView 中隐藏 QFileSystemModel 中的项目?

How to hide an item from QFileSystemModel in QTreeView in PySide?

我不知道如何从 QFileSystemModel 中隐藏一个项目或一行? 使用 removeRows 后没有任何反应。我也试过

    self.model.beginRemoveRows(QtCore.QAbstractItemModel.index(), 0, 10)
    self.model.endRemoveRows()

没有结果。我该怎么做?

QFileSystemModel 不遵循删除项目的常规函数​​,我猜是因为它具有潜在的破坏性。

每一个都需要调用self.model.remove(index)。这将永久删除文件。 如果恰好是文件夹,您还需要调用 self.model.rmdir(index)

http://doc.qt.io/qt-4.8/qfilesystemmodel.html#remove

如果您只是想隐藏行,那么您可以添加一个过滤器列表,例如["*.cpp", "*.h"] 通过 QFileSystem.setNameFilters, which uses QDir::setNameFIlters

如果你做的比较专业,那么你可以使用QSortFilterProxy。要么直接将它与 QRegExp 一起使用,要么子类化并实现 filterAcceptsRow()

顺便说一句:您永远不应该以模型的用户身份调用 beginXxxremoveXxx 方法。模型本身应该调用这些。

这是 PySide 包装器 API 设计中的一个错误。在 C++ 中,这些方法是受保护的。 Python 本身没有受保护方法的概念,尽管 Python 约定,PySide 的实现者显然选择使用朴素的名称公开受保护的方法。在 Python 中,通常在受保护的方法前加上单个下划线 _。私有方法使用双下划线 __,但这无关紧要,因为它们不会从 C++ 传播到 Pythonic API。