在拖放操作上交换QTreeView项

时间:2013-12-16 13:00:42

标签: c++ qt drag-and-drop qt4 qtreeview

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

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

让我们说用户将C拖到B.是否可以将这两个节点(包括子节点)作为拖放操作的结果进行交换?

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

我尝试了多种方法:从项目模型(dropMimeDatainsertRows等)继承到使用setDragDropOverwriteModeDragDropMode::InternalMove调整模式,以及子类化{{到目前为止,没有任何工作。

我遇到了以下技术限制:

  • dropEvent(QDropEvent * e)QStandardItemModel::dropMimeData不会让您知道源索引,它们会转发mime数据,并且无法获取源的QModelIndex来执行交换。

  • QTreeview::dropEventDragDropMode::InternalMove方法无法按预期工作,源节点会以某种方式附加到放置目标节点,并删除源节点。如果设置setDragDropOverwriteMode,则会保留源节点,但也不会覆盖目标节点。

赞赏正确的方向。

1 个答案:

答案 0 :(得分:4)

我检查source code of Qt,结果是要获取源索引,你应该使用当前选择。因此,请暂停QTreeview::dropEvent并通过调用selectedIndexes()获取当前选择。

<小时/> 交换不是问题。你必须做两次动作 有空间方法:QAbstractItemModel::moveRow(三分之一,你只有一列,所以移动行是好的)。 您可以在这里得到another solutions的答案(标准项目模型)。

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