簡體   English   中英

在QTreeView中拖放,removeRows未調用

[英]Drag and drop in QTreeView, removeRows not called

我在QTreeView拖放有一些問題:

我將標志設置為Qt::MoveAction並在我的模型中重新實現removeRows()dropMimeData()等。 Model繼承了QAbstractItemModel

當我拖放時,會自動調用mimeData()dropMimeData() ,並且dropMimeData()也會自動調用insertRows() 但是不調用removeRows() ,因此拖動的項目仍然存在。 我用谷歌搜索,但他們說他們的removeRows()被自動調用。

  • 為什么我的removeRows()不是在dropMimeData()之后dropMimeData()
  • Shoud我在dropMimeData()手動調用removeRows() dropMimeData()
  • 如果是這樣,我怎么知道之前的QModelIndex開始拖動?

當開始拖動時,在mimeData() ,我可以將索引保存在私有成員中,但看起來不太好。

任何意見,將不勝感激。

簡短的回答

如果所有內容Qt::MoveAction正確配置,則目標不應刪除源項,如果執行Qt::MoveAction ,則拖動的啟動器應刪除源項。

配置視圖

QAbstractItemView (它是QTreeView的基類, QListViewQTableView ,...)實現了startDrag QDrag操作的啟動和完成:

 if (drag->exec(supportedActions, defaultDropAction) == Qt::MoveAction) d->clearOrRemove(); 

因此,當請求的放下操作(由QDrag::exec返回)是Qt::MoveAction ,該項將自動刪除(或按setDragDropOverwriteMode指定清除)。

該視圖的重要配置選項包括:

  • setDragDropMode :指定視圖是否應接受從外部項目或僅內部項目拖放和/或刪除項目。 此函數相應地調用setDragEnabledsetAcceptDrops

  • setDragDropOverwriteMode :指定是否應刪除源項(在樹視圖中典型)或清除(在表視圖中典型)

  • setDefaultDropAction :啟動QDrag操作時指定的默認放置操作。

配置模型

除了視圖的配置外,您還應該正確配置模型。

  • 您應該實現模型的編輯界面 ,即removeRowsinsertRowsmoveRowssetData 雖然可能沒有必要根據您的具體情況實現所有這些,但無論如何,對於可編輯模型來說,實現它們是一種很好的方法。

  • supportedDropActions :重新實現此函數以返回支持放置操作(默認情況下為Qt::CopyAction )。 請注意,用戶可以通過按某些鍵在不同的支持操作之間切換。 shiftQt::MoveActioncontrolQt::CopyAction

    • supportedDragActions :如果支持的拖動操作與支持的拖放操作不同,則重新實現此功能。

例子

很好的例子是Qt本身的源代碼。 相應的Q*Widget類(例如QTreeWidget for QTreeView )提供了視圖和相應模型的具體實現。

我的自定義模型遇到了同樣的問題。 為視圖設置dragDropOverwriteMode=false解決了我的問題。

我想是的,如果Qt::DropActionQt::MoveAction ,你必須從dropMimeData()調用removeRows() ,即你將樹節點從一個地方完全移動到另一個地方。

WRT你的第二個問題,你可以在QAbstractItemModel::mimeData()創建自定義mime數據,並在那里編碼拖動節點的初始信息。 因此,在dropMimeData()函數中,您可以解碼並使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM