与 Qt 中的其他原语一样,QGraphicsItems 可以处理鼠标事件等。甜的!现在说我需要将一个 QGraphicsItem 上的事件传播到同一场景中的其他一些 QGraphicsItem。我可以想到两种方法可以解决这个问题:
(A) 天真的方法 - 发信号
概念:将兄弟 QGraphicsItems 与信号连接在一起。QGraphicsItem 上的事件处理程序调用 emit()s 来唤起其他 QGraphicItems 上的协调响应。这遵循在整个 Qt 框架中建立的一般设计模式。
实现:由于我不完全掌握的原因,QGraphicsItems 不能发出()信号。有人建议,也继承自 QGraphicsObject 的派生类可能能够解决此问题。不过,在我看来,在 QGraphicsItems 上排除 emit() 可能是 Qt 开发人员有意的设计决定,因此,多重继承可能不是正确的解决方案。
(B) 容器级事件处理
概念: QGraphicsItems 总是存在于 QGraphicsScene 类型的容器的上下文中。(A) 中在 QGraphicsItem 级别处理的事件由继承自 QGraphicsScene 的对象处理。该对象还实现了在同级 QGraphicsItems 之间协调响应的逻辑。
实现: QGraphicsScene 绝对有能力处理否则会进入 QGraphicsItems 的事件。QGraphicsScene 还提供了 itemsAt() 方法,用于确定其中的哪些事物受到位置事件的影响,例如鼠标点击。尽管如此,在容器类中为容器之间的协调动作建立相当多的逻辑感觉就像是无法正确封装。不好的做法?也许吧,但这似乎是至少在一个官方示例中的做法。
问题
- 什么是正确的解决方案?如果不是 A 或 B,那是不是我没有想到的其他东西?
- 为什么 Qt 开发人员允许 QGraphicsItems 接收事件但不发送信号?这似乎是整个框架中使用的设计模式的一个主要例外。
- 这个问题的一个扩展是 QGraphicsItems 和高阶容器类之间的通信,比如主应用程序。这意味着如何解决?