交换就拖QTreeView则项目和拖放操作
问题描述:
比方说,我们有以下层次:交换就拖QTreeView则项目和拖放操作
+ A
|-- B
|-- D
|-- 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
,则会保留源节点,但目标节点也不会被覆盖。
向正确的方向微调将不胜感激。
答
交换不是问题。你必须做两次移动。
有一种空间方法: QAbstractItemModel::moveRow(三个你只有一列,所以移动的行是好的)。 在这里您有一个与 another solutions(标准项目模型)的答案。
我检查了source code of Qt,事实证明,要获取源索引,您应该使用当前选择。因此,覆盖QTreeview::dropEvent
并通过调用selectedIndexes()获取当前选择。
交换不是问题。你必须做两次移动。
有一种空间方法: QAbstractItemModel::moveRow(三个你只有一列,所以移动的行是好的)。 在这里您有一个与 another solutions(标准项目模型)的答案。
如果您拥有自己的自定义模型,则必须直接对数据执行操作,并只发出关于移动项目的正确信号。
This Works!虽然它没有回答如何进行实际交换的问题。我一直在尝试使用'QStandardItemModel :: takeItem',当你尝试执行交换时,QModelIndex会被破坏。更不用说如何处理子节点。 – voodooattack
这部分很容易看到更新。 –
虽然这是Qt5。 – voodooattack