[英]Drag and drop in QTreeView, removeRows not called
我在QTreeView
拖放有一些問題:
我將標志設置為Qt::MoveAction
並在我的模型中重新實現removeRows()
, dropMimeData()
等。 Model繼承了QAbstractItemModel
。
當我拖放時,會自動調用mimeData()
, dropMimeData()
,並且dropMimeData()
也會自動調用insertRows()
。 但是不調用removeRows()
,因此拖動的項目仍然存在。 我用谷歌搜索,但他們說他們的removeRows()
被自動調用。
removeRows()
不是在dropMimeData()
之后dropMimeData()
? dropMimeData()
手動調用removeRows()
dropMimeData()
? QModelIndex
開始拖動? 當開始拖動時,在mimeData()
,我可以將索引保存在私有成員中,但看起來不太好。
任何意見,將不勝感激。
簡短的回答
如果所有內容Qt::MoveAction
正確配置,則目標不應刪除源項,如果執行Qt::MoveAction
,則拖動的啟動器應刪除源項。
配置視圖
QAbstractItemView
(它是QTreeView
的基類, QListView
, QTableView
,...)實現了startDrag
QDrag
操作的啟動和完成:
if (drag->exec(supportedActions, defaultDropAction) == Qt::MoveAction) d->clearOrRemove();
因此,當請求的放下操作(由QDrag::exec
返回)是Qt::MoveAction
,該項將自動刪除(或按setDragDropOverwriteMode
指定清除)。
該視圖的重要配置選項包括:
setDragDropMode
:指定視圖是否應接受從外部項目或僅內部項目拖放和/或刪除項目。 此函數相應地調用setDragEnabled
和setAcceptDrops
。
setDragEnabled
:啟用內置拖動機制 setAcceptDrops
:啟用內置放置機制 setDragDropOverwriteMode
:指定是否應刪除源項(在樹視圖中典型)或清除(在表視圖中典型)
setDefaultDropAction
:啟動QDrag
操作時指定的默認放置操作。
配置模型
除了視圖的配置外,您還應該正確配置模型。
您應該實現模型的編輯界面 ,即removeRows
, insertRows
, moveRows
和setData
。 雖然可能沒有必要根據您的具體情況實現所有這些,但無論如何,對於可編輯模型來說,實現它們是一種很好的方法。
supportedDropActions
:重新實現此函數以返回支持放置操作(默認情況下為Qt::CopyAction
)。 請注意,用戶可以通過按某些鍵在不同的支持操作之間切換。 ( shift
為Qt::MoveAction
和control
為Qt::CopyAction
)
supportedDragActions
:如果支持的拖動操作與支持的拖放操作不同,則重新實現此功能。 例子
很好的例子是Qt本身的源代碼。 相應的Q*Widget
類(例如QTreeWidget
for QTreeView
)提供了視圖和相應模型的具體實現。
我的自定義模型遇到了同樣的問題。 為視圖設置dragDropOverwriteMode=false
解決了我的問題。
我想是的,如果Qt::DropAction
是Qt::MoveAction
,你必須從dropMimeData()
調用removeRows()
,即你將樹節點從一個地方完全移動到另一個地方。
WRT你的第二個問題,你可以在QAbstractItemModel::mimeData()
創建自定義mime數據,並在那里編碼拖動節點的初始信息。 因此,在dropMimeData()
函數中,您可以解碼並使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.