在拖放操作中交换QTreeView项目
Swap QTreeView items on drag and drop operation
假设我们有以下层次结构:
+ 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
,则会保留源节点,但也不会覆盖目标节点。
如果能朝着正确的方向推动,我们将不胜感激。
我检查了Qt的源代码,结果发现要获取源索引,应该使用当前选择。因此,重写QTreeview::dropEvent
并通过调用selectedIndexes()获取当前选择。
交换不是问题。你只需要移动两次
有一种空间方法:QAbstractItemModel::moveRow(三行中只有一列,所以可以移动行)。这里有另一个解决方案的答案(针对标准物品模型)。
如果你有自己的自定义模型,你必须直接在你的数据上进行,并且只发出关于移动项目的适当信号。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 更新 QTreeView 和 QListView 中的项目
- 如何使用QTreeView在QComboBox中选择项目
- 从 QTreeView 中删除项目时取消选择所有行
- 使用QTREEVIEW中的Qcombobox委托项目
- 无法通过 QModelIndex 从 QTreeView 获取项目
- QTreeView 项目悬停/基于当前颜色选择的背景颜色
- 循环浏览所有项目,其中QTREEVIEW QFILESYSTEMMODEL上具有所需的文件扩展名
- 如何从QTreeView中的项目获取索引
- QTreeView中可见项目的列表
- QTreeView模型的Qt-itemChanged信号仅适用于一级项目
- 如何在QTreeView中获取所选项目
- 如何确切知道用户何时扩展QTreeView项目
- 在拖放操作中交换QTreeView项目
- QTreeView 使用示例 - 如何将子节点添加到现有项目
- 如何检查在QTreeView中是否有任何项目正在编辑
- 如何知道QTreeView项目装饰被点击
- 使用键盘箭头选择QTreeView中的项目
- 筛选QStandardItemModel或QTreeView中的项目
- 右键单击QTreeView项目