簡體   English   中英

在拖放操作上交換QTreeView項

[英]Swap QTreeView items on drag and drop operation

假設我們有以下層次結構:

+ A
|-- B
  |-- D
|-- C

並且假設用戶將C拖到B.是否可以將這兩個節點(包括子節點)作為拖放操作的結果進行交換?

+ A
|-- C
|-- B
  |-- D

我嘗試了多種方法:從子類化項目模型( dropMimeDatainsertRows等)到使用setDragDropOverwriteModeDragDropMode::InternalMove調整模式, setDragDropOverwriteMode dropEvent(QDropEvent * e)並且到目前為止沒有任何工作。

我遇到了以下技術限制:

  • QStandardItemModel::dropMimeDataQTreeview::dropEvent不會讓你知道源索引,它們轉發mime數據,並且無法獲得源的QModelIndex來執行交換。

  • DragDropMode::InternalMovesetDragDropOverwriteMode方法無法按預期工作,源節點以某種方式附加到放置目標節點,並刪除源節點。 如果設置DragDropMode::Copy ,則會保留源節點,但也不會覆蓋目標節點。

向正確的方向輕推將是值得贊賞的。

我檢查了Qt的源代碼,結果發現要獲取源索引你應該使用當前選擇。 因此,通過調用selectedIndexes()來覆蓋QTreeview::dropEvent並獲取當前選擇。


交換不是問題。 你必須做兩次。
有空間方法: QAbstractItemModel :: moveRow三個你只有一列,所以移動行是好的)。 在這里,您可以使用其他解決方案 (標准項目模型)。

如果您有自己的自定義模型,則必須直接對數據進行操作,並發出有關移動項目的正確信號。

暫無
暫無

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

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