假设我们有以下层次结构:
+ A
|-- B
|-- D
|-- C
让我们说用户将C拖到B.是否可以将这两个节点(包括子节点)作为拖放操作的结果进行交换?
+ A
|-- C
|-- B
|-- D
我尝试了多种方法:从项目模型(dropMimeData
,insertRows
等)继承到使用setDragDropOverwriteMode
和DragDropMode::InternalMove
调整模式,以及子类化{{到目前为止,没有任何工作。
我遇到了以下技术限制:
dropEvent(QDropEvent * e)
和QStandardItemModel::dropMimeData
不会让您知道源索引,它们会转发mime数据,并且无法获取源的QModelIndex来执行交换。
QTreeview::dropEvent
和DragDropMode::InternalMove
方法无法按预期工作,源节点会以某种方式附加到放置目标节点,并删除源节点。如果设置setDragDropOverwriteMode
,则会保留源节点,但也不会覆盖目标节点。
赞赏正确的方向。
答案 0 :(得分:4)
我检查source code of Qt,结果是要获取源索引,你应该使用当前选择。因此,请暂停QTreeview::dropEvent
并通过调用selectedIndexes()获取当前选择。
如果您有自己的自定义模型,则必须直接对数据进行操作,并发出有关移动项目的正确信号。