0
我創建了一個派生自QAbrstractItemModel
的類,以便在QTreeView
下顯示。我需要拖動&拖放操作來使用鼠標重新排序項目。qt QAbstractItemModel拖放移動項目執行刪除/插入
但是,我注意到當我這樣做時,通過移除索引並在新位置下創建新索引來移動項目。但我重新實現了moveRows()
方法。
什麼可能是錯的?或者這是預期的行爲?
我創建了一個派生自QAbrstractItemModel
的類,以便在QTreeView
下顯示。我需要拖動&拖放操作來使用鼠標重新排序項目。qt QAbstractItemModel拖放移動項目執行刪除/插入
但是,我注意到當我這樣做時,通過移除索引並在新位置下創建新索引來移動項目。但我重新實現了moveRows()
方法。
什麼可能是錯的?或者這是預期的行爲?
問題是在Qt 5中引入了moveRows
(及其所有伴隨函數)。對QAbstractItemModel子類的拖放支持來自Qt 4,即使在Qt 5中,它仍然包含一個insert + a remove ,因爲我們不想在Qt 4移植到Qt 5時打破Qt 4項目。
因此,Qt 5沒有使用任何moveRows
(例如參見here)。長期來看,Qt需要找到一種方法來利用模型上的移動操作,這必然是一個選擇加入功能(我們不能破壞代碼!)。這個問題真的是「誰會做這個龐大的工作」...
刪除+插入不能正常工作對我來說。當我移動一個項目或將它追加到一個孩子時,我看到我的'removeRows'被調用,但不是我的'insertRows'。因此,當我移動某個項目時,它總是出現在我的樹的末尾。你有什麼想法爲什麼發生這種情況? – manatttta
我認爲'dropMimeData'應該被調用,而不是'insertRows',然後是'removeRows'。參看[這裏](https://code.woboq.org/qt5/qtbase/src/widgets/itemviews/qabstractitemview.cpp.html#_ZN17QAbstractItemView9dropEventEP10QDropEvent)和這裏的文檔https://doc.qt.io/qt-5/ model-view-programming.html#using-model-view-classes。如有疑問,我通常會查看來源。 – peppe
你是對的!謝謝 – manatttta