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

时间:2016-11-30 16:00:53

标签: python qt pyside qfilesystemmodel

我无法弄清楚如何隐藏QFileSystemModel中的项目或行? 使用removeRows后没有任何反应。我也试过了

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

没有结果。我该怎么办?

2 个答案:

答案 0 :(得分:4)

QFileSystemModel并没有遵循传统的删除项目的功能,我想因为它具有潜在的破坏性。

您需要为每个人拨打self.model.remove(index)。这将永久删除文件。 如果恰好是文件夹,您还需要致电self.model.rmdir(index)

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

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

如果您正在做更专业的事情,那么您可以使用QSortFilterProxy。直接使用QRegExp或子类并实现filterAcceptsRow()

答案 1 :(得分:3)

暂且不说:您永远不应该将beginXxxremoveXxx方法称为模型的用户。模型本身应该调用它们。

这是PySide包装器API设计中的错误。在C ++中,这些方法受到保护。 Python本身没有受保护方法的概念,并且PySide的实现者显然选择使用纯粹的名称来公开受保护的方法,尽管有Python惯例。在Python中,使用单个下划线_为受保护的方法添加前缀可能是常规的。私有方法使用双下划线__,但这并不重要,因为它们不会从C ++传播到Pythonic API中。