2016-11-30 76 views

回答

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()

+0

谢谢,我必须阅读更多有关这个问题。但是我不能只隐藏视图中的项目吗?因为,事实上,这正是我想要做的。 –

+1

QFileSystemModel支持简单的名称过滤器(添加到答案),或使用更复杂的QSortFilterProxy。不要以为你可以删除第1行。 –

3

顺便说一句:您不应该将beginXxxremoveXxx方法称为模型的用户。模型本身应该调用这些模型。

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

+0

[double-underscore](http://docs.python.org/3/reference/expressions.html#atom-identifiers)不仅仅是一个约定 - 它的一部分的语言规范。为了避免基本类和派生类的“私有”属性之间发生冲突,双下划线的名称会自动变形。单下划线名称没有真正的约定 - 例如,标准库[namedtuple](https://docs.python.org/3/library/collections.html#collections.somenamedtuple._make)类使用它们作为部分的公共API。 – ekhumoro