假设我们有以下层次结构:
+ A
|-- B
|-- D
|-- C
假设用户将 C 拖到 B 上。作为拖放操作的结果,是否有可能交换两个节点(包括子节点)?
+ A
|-- C
|-- B
|-- D
我尝试了多种方法:从对项目模型(
dropMimeData
、 insertRows
等)进行子类化到使用 setDragDropOverwriteMode
和 DragDropMode::InternalMove
调整模式,再到对 dropEvent(QDropEvent * e)
进行子类化,到目前为止没有任何效果。我遇到了以下技术限制:
QStandardItemModel::dropMimeData
和 QTreeview::dropEvent
不会让您知道源索引,它们转发 mime 数据,并且无法获取源的 QModelIndex 来执行交换。 DragDropMode::InternalMove
和 setDragDropOverwriteMode
方法没有按预期工作,源节点以某种方式附加到放置目标节点,然后删除源节点。如果设置 DragDropMode::Copy
,则保留源节点,但也不会覆盖目标节点。 朝着正确方向的插入将不胜感激。
最佳答案
我检查了 source code of Qt ,结果证明要获取源索引,您应该使用当前选择。因此覆盖 QTreeview::dropEvent
并通过调用 selectedIndexes() 获取当前选择。
交换不是问题。你只需要移动两次。
有一种空间方法:QAbstractItemModel::moveRow(三个你只有一列,所以移动行是可以的)。
在这里,您可以通过 another solutions(对于标准项目模型)获得答案。
如果您有自己的自定义模型,您必须直接对您的数据进行操作,并发出有关移动项目的正确信号。
关于c++ - 在拖放操作中交换 QTreeView 项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20611574/