【问题标题】:Swap QTreeView items on drag and drop operation在拖放操作上交换 QTreeView 项目
【发布时间】:2014-01-03 21:10:35
【问题描述】:

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

+ 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,则保留源节点,但也不会覆盖目标节点。

我们将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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


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

    如果您有自己的自定义模型,则必须直接在数据上执行此操作,并发出有关移动项目的适当信号。

    【讨论】:

    • 这行得通!虽然它没有回答如何进行实际交换的问题。我一直在尝试使用QStandardItemModel::takeItem 等,但是当您尝试执行交换时QModelIndexes 会损坏。更不用说如何处理子节点了。
    • 那是 Qt5 的。
    • 谢谢!无论如何,自从我迁移到 Qt5 以来,我已经接受了您的回答。不过,由于 QTreeview 中的 bug,这种方法会导致崩溃,所以我建议迁移。
    猜你喜欢
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2012-12-11
    • 2011-10-20
    • 2011-05-14
    • 1970-01-01
    相关资源
    最近更新 更多