【发布时间】:2012-05-22 09:11:41
【问题描述】:
与 Qt 中的其他原语一样,QGraphicsItems 可以处理鼠标事件等。甜的!现在说我需要将一个 QGraphicsItem 上的事件传播到同一场景中的其他一些 QGraphicsItem。我可以想到两种方法来解决这个问题:
(A) 天真的方法 - 信号
概念: 将兄弟 QGraphicsItems 与信号连接在一起。 QGraphicsItem 上的事件处理程序调用 emit()s 来唤起其他 QGraphicItems 上的协调响应。这遵循了整个 Qt 框架建立的一般设计模式。
实现:由于我没有完全理解的原因,QGraphicsItems 不能发出()信号。 It has been suggested 同样从 QGraphicsObject 继承的派生类可能能够解决这个问题。不过,在我看来,在 QGraphicsItems 上排除 emit() 可能是 Qt 开发人员有意的设计决定,因此,多重继承可能不是正确的解决方案。
(B) 容器级事件处理
概念: QGraphicsItems 始终存在于 QGraphicsScene 类型的容器的上下文中。 (A) 中在 QGraphicsItem 级别处理的事件由继承自 QGraphicsScene 的对象处理。该对象还实现了在同级 QGraphicsItem 之间协调响应的逻辑。
实现: QGraphicsScene 绝对有能力处理否则会进入 QGraphicsItems 的事件。 QGraphicsScene 还提供了 itemsAt() 方法,用于确定其中的哪些事物受到位置事件的影响,例如鼠标点击。尽管如此,在容器类中为容器之间的协调动作建立相当大的逻辑感觉就像是无法正确封装。不好的做法?也许吧,但这似乎是至少在one official example 中完成的方式。
问题
- 什么是正确的解决方案?如果不是 A 或 B,那是不是我没有想到的其他东西?
- 为什么 Qt 开发人员允许 QGraphicsItems 接收事件但不发送信号?这似乎是整个框架中使用的设计模式的一个主要例外。
- 这个问题的一个扩展是 QGraphicsItems 和高阶容器类之间的通信,比如主应用程序。这意味着如何解决?
【问题讨论】:
-
仅供参考:这里的用例是一个可调整大小的矩形。它将在其每个角上都有驱动点,当单击并拖动这些驱动点时,也会导致入射边缘移动。
-
这些边不会是矩形的子级,因此父级应该知道它们吗?
-
我想,是的,如果我使用 QGraphicsItemGroup 或类似的东西实现 (B)。
-
不,我的意思是这种情况听起来您应该创建一个具有子项的自定义子类。因此,父母可以直接对孩子采取行动,而不是上下协调。