为啥所有选中的 QGraphicsItem 都没有收到 mouseMove 事件?

Posted

技术标签:

【中文标题】为啥所有选中的 QGraphicsItem 都没有收到 mouseMove 事件?【英文标题】:Why does all selected QGraphicsItem not receive mouseMove event?为什么所有选中的 QGraphicsItem 都没有收到 mouseMove 事件? 【发布时间】:2014-11-24 15:01:52 【问题描述】:

我的自定义 GraphicsScene 上有几个 QGraphicsItem 对象。它们具有不同的自定义类型,因此其中一些必须以一种方式处理 MouseMove 事件,而另一些则以不同的方式处理。 当我选择其中一些然后移动所选项目时,只有鼠标光标下的项目会收到 MouseMove 事件,而其他项目不会。开始移动时,我必须在 MyCustomItemClass::mouseMoveEvent 中进行一些额外的操作。 那么为什么其他物品没有收到事件呢?

【问题讨论】:

【参考方案1】:

根据您的描述,我不会在MyCustomItemClass::mouseMoveEvent 中处理这些操作,因为只有当鼠标移动到您已经说过的特定项目的顶部时才会执行。

相反,我将mouseMoveEvent 子类化到scene 中,以检查选择了哪些项目并在这些项目中执行相关方法。当然,您必须小心,仅根据鼠标的相对移动将它们相对于其原始位置移动。

【讨论】:

但是对于位于场景中的不同类别的项目,我必须在移动开始时执行不同的操作。而且这些类可能没有共同的基类。检查场景中项目类型的方法并不好,因为我们必须将场景中的项目转换为特定的类类型。我该如何处理? 选角有什么问题?你有多少不同的课程太费力了? 即使有四个不同的类,强制转换也不是最好的解决方案,因为 if-else 序列很大。 我可能会使用switch,而只有四个cases,它肯定不是很大 顺便问一下,您认为用一个纯虚方法(如接口类)创建新类会是一个好的解决方案吗?在这种情况下,每个请求的图形类都可以从此类派生,并在此类重载方法中定义其自定义行为。【参考方案2】:

如果要选择一组项目,然后一次全部移动,可以在选择期间将它们添加到QGraphicsItemGroup,然后将组作为单个对象移动,这将移动组。

【讨论】:

但我还需要单独执行组中任何项目的移动。 QGraphicsItemGroup 不提供这种可能性 - 在从组中移动某些项目期间,所有分组的项目总是会与该项目一起移动。 如果选择了多个项目,添加到组并移动。取消选择时,从组中删除项目。

以上是关于为啥所有选中的 QGraphicsItem 都没有收到 mouseMove 事件?的主要内容,如果未能解决你的问题,请参考以下文章

如果选择该项目,为啥 QGraphicsItem 子项不再单击鼠标?

为啥 itemAt() 并不总能找到 QGraphicsItem

为啥自定义 QGraphicsItem 会导致场景或视图移动,除非 boundingRect 为空?

为啥缩放 qgraphicsview qgraphicsitem 后会留下痕迹

QGraphicsItem 类型转换

QGraphicsItem绘制问题