Qtの他のプリミティブと同様に、QGraphicsItemsはマウスイベントなどを処理できます。甘い!ここで、1つのQGraphicsItemのイベントを、同じシーン内の他のQGraphicsItemに伝播する必要があるとします。私はこれにアプローチするかもしれない2つの方法を考えることができます:
(A)素朴なアプローチ-シグナリング
コンセプト:兄弟のQGraphicsItemsをシグナルと接続します。QGraphicsItemのイベントハンドラーは、他のQGraphicItemsで調整された応答を呼び出すemit()を呼び出します。これは、Qtフレームワーク全体で確立された一般的なデザインパターンに従います。
実装:私が完全に理解していない理由により、QGraphicsItemsは()信号を発行できません。QGraphicsObjectからも継承する派生クラスがこれを回避できる可能性があることが示唆されています。ただし、QGraphicsItemsでのemit()の除外は、おそらくQt開発者の意図的な設計上の決定であり、したがって、多重継承はおそらく正しい解決策ではないように思われます。
(B)コンテナレベルのイベント処理
概念: QGraphicsItemsは、常にタイプQGraphicsSceneのコンテナーのコンテキストに存在します。(A)でQGraphicsItemのレベルで処理されたイベントは、代わりにQGraphicsSceneから継承したオブジェクトによって処理されます。このオブジェクトは、兄弟のQGraphicsItem間の応答を調整するためのロジックも実装します。
実装: QGraphicsSceneには、QGraphicsItemsに到達するイベントを確実に処理する機能があります。QGraphicsSceneは、マウスクリックなどの位置イベントの影響を受けるものを判別するためのitemsAt()メソッドも提供します。それでも、コンテナクラス内にかなりのロジックを構築して、被収容者間の調整されたアクションを実現することは、適切にカプセル化できないように感じます。悪い習慣?たぶん、しかしこれは少なくとも1つの公式の例で行われている方法のようです。
質問
- ここで正しい解決策は何ですか?AでもBでもないのなら、それは私が考えていなかった何か他のものですか?
- Qt開発者がQGraphicsItemsにイベントの受信を許可し、シグナルの送信を許可しないのはなぜですか?これは、フレームワーク全体で使用されるデザインパターンの主要な例外のようです。
- この問題の拡張は、QGraphicsItemsとメインアプリケーションのような高次コンテナクラスとの間の通信です。それはどのように対処されることを意味しますか?