在QTreeView中拖放,removeRows未调用

Win*_*gha 4 treeview qt drag-and-drop

我在拖放时遇到一些问题QTreeView

我在模型中设置了 flag并Qt::MoveAction重新实现了等。该模型继承了.removeRows()dropMimeData()QAbstractItemModel

当我拖放时,mimeData()dropMimeData()会自动调用,并且也会自动dropMimeData()调用insertRows()。但removeRows()没有被调用,所以拖动的项目仍然存在。我用谷歌搜索,但他们说他们的removeRows()电话是自动呼叫的。

  • removeRows()为什么我的之后没有被叫到dropMimeData()
  • 我应该removeRows()手动拨入dropMimeData()吗?
  • 如果是这样,我怎样才能知道QModelIndex拖动开始的时间?

当开始拖动时,在 中mimeData(),我可以将索引保存在私有成员中,但看起来不太好。

任何意见,将不胜感激。

m79*_*13d 6

简短回答

Qt::MoveAction如果一切配置正确,则目标不应删除源项目,如果执行a,则拖动的发起者应删除源项目。

视图的配置

QAbstractItemViewQTreeView(它是, QListView, , ...的基类)在 中QTableView实现操作的启动和完成:QDragstartDrag

if (drag->exec(supportedActions, defaultDropAction) == Qt::MoveAction)
    d->clearOrRemove();
Run Code Online (Sandbox Code Playgroud)

因此,当请求的放置操作(由 返回QDrag::exec)为 a时Qt::MoveAction,该项目将自动删除(或按照 指定清除setDragDropOverwriteMode)。

视图的重要配置选项有:

  • setDragDropMode:指定视图是否应接受来自外部项目或仅内部项目的拖放项目。该函数相应地调用setDragEnabledand setAcceptDrops

  • setDragDropOverwriteMode:指定是否应删除源项目(通常在树视图中)或清除(通常在表视图中)

  • setDefaultDropAction:启动操作时指定的默认放置操作QDrag

型号配置

除了视图的配置之外,您还应该正确配置模型。

  • 您应该实现模型的编辑界面removeRows,即、insertRowsmoveRowssetData。尽管根据您的具体情况,可能没有必要实现所有这些,但对于可编辑模型来说,无论如何实现它们都是一个好方法。

  • supportedDropActions:重新实现此函数以返回支持删除操作(Qt::CopyAction默认情况下)。请注意,用户可以通过按某些键在不同支持的操作之间切换。(shift对于Qt::MoveActioncontrol对于Qt::CopyAction

    • supportedDragActions:如果支持的拖动操作与支持的放置操作不同,请重新实现此功能。

例子

Qt 本身的源代码就是很好的例子。相应的Q*Widget类(例如QTreeWidgetfor QTreeView)提供了视图和相应模型的具体实现。