如何在 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()
顺便说一句:您永远不应该以模型的用户身份调用 beginXxx
和 removeXxx
方法。模型本身应该调用这些。
这是 PySide 包装器 API 设计中的一个错误。在 C++ 中,这些方法是受保护的。 Python 本身没有受保护方法的概念,尽管 Python 约定,PySide 的实现者显然选择使用朴素的名称公开受保护的方法。在 Python 中,通常在受保护的方法前加上单个下划线 _
。私有方法使用双下划线 __
,但这无关紧要,因为它们不会从 C++ 传播到 Pythonic API。
我不知道如何从 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()
顺便说一句:您永远不应该以模型的用户身份调用 beginXxx
和 removeXxx
方法。模型本身应该调用这些。
这是 PySide 包装器 API 设计中的一个错误。在 C++ 中,这些方法是受保护的。 Python 本身没有受保护方法的概念,尽管 Python 约定,PySide 的实现者显然选择使用朴素的名称公开受保护的方法。在 Python 中,通常在受保护的方法前加上单个下划线 _
。私有方法使用双下划线 __
,但这无关紧要,因为它们不会从 C++ 传播到 Pythonic API。