2013-12-16 60 views
3

比方说,我们有以下层次:交换就拖QTreeView则项目和拖放操作

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

而且假设用户拖动下向B.是否有可能有两个节点(包括儿童)替换为该拖放操作的结果?

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

我试过多种方法:从子类的项目模型(dropMimeDatainsertRows等),以调整模式与setDragDropOverwriteModeDragDropMode::InternalMove,以继承dropEvent(QDropEvent * e)并没有什么至今工作。

我遇到以下赵彤限制:

  • QStandardItemModel::dropMimeDataQTreeview::dropEvent不会让你知道源指标,他们向前MIME数据,而且也没有办法获取源的QModelIndex执行交换。

  • DragDropMode::InternalMovesetDragDropOverwriteMode方法不按预期工作,源节点以某种方式被追加到放置目标节点,并且源节点被删除。如果设置了DragDropMode::Copy,则会保留源节点,但目标节点也不会被覆盖。

向正确的方向微调将不胜感激。

回答

4

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


交换不是问题。你必须做两次移动。
有一种空间方法: QAbstractItemModel::moveRow(三个你只有一列,所以移动的行是好的)。 在这里您有一个与 another solutions(标准项目模型)的答案。

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

+1

This Works!虽然它没有回答如何进行实际交换的问题。我一直在尝试使用'QStandardItemModel :: takeItem',当你尝试执行交换时,QModelIndex会被破坏。更不用说如何处理子节点。 – voodooattack

+0

这部分很容易看到更新。 –

+0

虽然这是Qt5。 – voodooattack