2016-11-30 73 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