【问题标题】:Why does QAbstractItemView removes elements after a MoveAction drag and drop?为什么 QAbstractItemView 在 MoveAction 拖放后删除元素?
【发布时间】:2017-11-02 21:37:09
【问题描述】:

我注意到QAbstractItemView 的源代码中,void startDrag(Qt::DropActions supportedActions) 方法在类型为MoveAction() 的拖动后调用了一些clearOrRemove() 私有,这会删除选定的项目。

重点是,当放置动作发生在同一个视图中时,我的模型使用moveRows() 实现该动作,因此行被移动,然后clearOrRemove() 将它们删除,就好像它们是原始行一样。

如何防止最后一次删除?我是否错过了实现仅移动模型的惯用方式(意味着可以移动项目但不能添加/删除)?

【问题讨论】:

  • 我认为问题在于moveRows 是一个Qt 5 API,并且DND 在Qt 中通过insert+remove 实现了4 次...
  • 你的意思是它会是一个错误?他们不是调整了 DnD API 吗? Qt 4 如何实现 MoveAction?
  • 正如我所说,通过插入/删除。我不确定它是否符合错误的条件,因为 Qt 4 软件在移植到 Qt 5 时仍然可以工作(这样的旧软件不会覆盖 moveRows,因为它当时不存在。 ..)。但是请务必提交一份错误报告,以便在那里进行讨论。

标签: qt drag-and-drop qabstractitemmodel qabstractitemview


【解决方案1】:

我遇到了同样的问题并找到了解决方法:

很可能您已经覆盖了模型的QAbstractItemModel::dropMimeData-方法。 如果掺杂的 mime 数据由该方法处理,则该方法应该返回 true,否则返回 false。 诀窍是如果actionMoveAction,则返回false,即使数据处理正确(在该方法中实现处理)。 视图认为放置不成功,因此不会删除拖动的项目。

也许,破解返回值会在更复杂的设置中产生一些问题,但它适用于我的简单案例。

【讨论】:

  • 这会导致显示动画的系统出现问题。在 Mac 上返回 false 将导致触发拒绝动画(拖动的项目将在视觉上返回到其先前的位置)。
猜你喜欢
  • 2012-01-06
  • 2022-10-12
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 2021-09-18
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
相关资源
最近更新 更多