我想不出如何隱藏QFileSystemModel
中的一個項目或一行? 使用removeRows
後沒有任何反應。我也試過如何在PySide的QTreeView中隱藏QFileSystemModel中的項目?
self.model.beginRemoveRows(QtCore.QAbstractItemModel.index(), 0, 10)
self.model.endRemoveRows()
沒有結果。我該怎麼做?
我想不出如何隱藏QFileSystemModel
中的一個項目或一行? 使用removeRows
後沒有任何反應。我也試過如何在PySide的QTreeView中隱藏QFileSystemModel中的項目?
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,它使用QDir::setNameFIlters。
如果您正在做更專業的事情,那麼您可以使用QSortFilterProxy
。直接使用QRegExp或子類實現filterAcceptsRow()
順便說一句:您不應該將beginXxx
和removeXxx
方法稱爲模型的用戶。模型本身應該調用這些模型。
這是PySide包裝器的API設計中的一個錯誤。在C++中,這些方法受到保護。 Python本身並沒有受保護方法的概念,PySide的實現者顯然選擇使用無名稱公開受保護的方法,儘管採用了Python約定。在Python中,用一個下劃線_
前綴受保護的方法可能是常規的。私有方法使用雙下劃線__
,但這並不重要,因爲它們不會傳播到C++的Pythonic API中。
[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
謝謝,我必須閱讀更多有關這個問題。但是我不能只隱藏視圖中的項目嗎?因爲,事實上,這正是我想要做的。 –
QFileSystemModel支持簡單的名稱過濾器(添加到答案),或使用更復雜的QSortFilterProxy。不要以爲你可以刪除第1行。 –