和Qt中的其他原语一样,QGraphicsItems可以处理鼠标事件等。太好了!现在假设我需要将一个QGraphicsItem上的事件传播到同一场景中的其他QGraphicsItems上。我可以想到两种方法:
(A) 愚蠢的方法 - 信号
概念:使用信号将兄弟QGraphicsItems连接在一起。QGraphicsItem上的事件处理程序调用emit(),引发其他QGraphicItems的协调响应。这遵循Qt框架中建立的一般设计模式。
实现:由于某些原因,QGraphicsItems无法发出信号。有人建议从QGraphicsObject继承的派生类可能能够解决此问题。然而,对我来说,排除在QGraphicsItems上使用emit()可能是Qt开发人员的一个有意设计决策,因此多重继承可能不是正确的解决方案。
(B) 容器级事件处理
概念:QGraphicsItems始终存在于类型为QGraphicsScene的容器中。在(A)中处理的事件现在由继承自QGraphicsScene的对象处理。该对象还实现了协调兄弟QGraphicsItems之间响应的逻辑。
实现:QGraphicsScene绝对有处理事件的能力,否则这些事件会传递到QGraphicsItems。QGraphicsScene还提供了itemsAt()方法,用于确定哪些内容受到位置事件(如鼠标单击)的影响。然而,在容器类中构建大量逻辑以协调包含物之间的操作感觉像是未能正确封装。不好的做法?也许是的,但至少在一个官方示例中是这样做的。
问题
- 这里的正确解决方案是什么?如果不是 A 或 B,那么还有其他我没有想到的吗?
- 为什么 Qt 开发人员允许 QGraphicsItems 接收事件但不发送信号?这似乎是整个框架中使用的设计模式的一个重要例外。
- 这个问题的扩展是 QGraphicsItems 和更高级别的容器类(如主应用程序)之间的通信。这该如何解决?