假设我们有以下层次结构:

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

假设用户将 C 拖到 B 上。作为拖放操作的结果,是否有可能交换两个节点(包括子节点)?
+ A
|-- C
|-- B
  |-- D

我尝试了多种方法:从对项目模型( dropMimeDatainsertRows 等)进行子类化到使用 setDragDropOverwriteModeDragDropMode::InternalMove 调整模式,再到对 dropEvent(QDropEvent * e) 进行子类化,到目前为止没有任何效果。

我遇到了以下技术限制:
  • QStandardItemModel::dropMimeDataQTreeview::dropEvent 不会让您知道源索引,它们转发 mime 数据,并且无法获取源的 QModelIndex 来执行交换。
  • DragDropMode::InternalMovesetDragDropOverwriteMode 方法没有按预期工作,源节点以某种方式附加到放置目标节点,然后删除源节点。如果设置 DragDropMode::Copy ,则保留源节点,但也不会覆盖目标节点。

  • 朝着正确方向的插入将不胜感激。

    最佳答案

    我检查了 source code of Qt ,结果证明要获取源索引,您应该使用当前选择。因此覆盖 QTreeview::dropEvent 并通过调用 selectedIndexes() 获取当前选择。

    交换不是问题。你只需要移动两次。
    有一种空间方法:QAbstractItemModel::moveRow(三个你只有一列,所以移动行是可以的)。
    在这里,您可以通过 another solutions(对于标准项目模型)获得答案。

    如果您有自己的自定义模型,您必须直接对您的数据进行操作,并发出有关移动项目的正确信号。

    关于c++ - 在拖放操作中交换 QTreeView 项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20611574/

    10-15 06:25