Zdarzenia i sygnały w QG's QGraphicsItem: Jak to * ma działać *?

Podobnie jak inne prymitywy w Qt, QGraphicsItems może obsługiwać zdarzenia myszy i tym podobne. Słodkie! Teraz powiem, że potrzebuję zdarzenia na jednym QGraphicsItem, aby było ono propagowane do innych QGraphicsItems w tej samej scenie. Mogę pomyśleć o dwóch sposobach, do których można podejść:

(A) Podejście naiwne - sygnalizacja

Koncepcja: Połącz rodzeństwo QGraphicsItems wraz z sygnałami. Procedury obsługi zdarzeń w wywołaniu QGraphicsItem emit () s, które wywołują skoordynowane odpowiedzi w innych QGraphicItems. Jest to zgodne z ogólnym wzorcem projektowym ustanowionym w ramach Qt.

Realizacja : Z powodów, których nie rozumiem w pełni, QGraphicsItems nie może emitować () sygnałów.To było sugerowane że klasy pochodne, które również dziedziczą po QGraphicsObject, mogą to obejść. Wydaje mi się jednak, że wykluczenie emit () w QGraphicsItems było prawdopodobnie zamierzoną decyzją projektową ze strony deweloperów Qt, a zatem wielokrotne dziedziczenie prawdopodobnie nie jest właściwym rozwiązaniem.

(B) Obsługa zdarzeń na poziomie kontenerów

Koncepcja: QGraphicsItems zawsze istnieją w kontekście kontenera typu QGraphicsScene. Zdarzenia, które w (A) były obsługiwane na poziomie QGraphicsItem, są obsługiwane przez obiekt dziedziczący z QGraphicsScene. Ten obiekt implementuje również logikę do koordynowania odpowiedzi między rodzeństwem QGraphicsItems.

Realizacja : QGraphicsScene zdecydowanie ma możliwość obsługi zdarzeń, które w przeciwnym razie trafiłyby do QGraphicsItems. QGraphicsScene zapewnia również metodę itemsAt () do określania, na które z elementów wpływają zdarzenia pozycyjne, takie jak kliknięcia myszą. Nadal budowanie znacznej logiki w ramach klasy kontenerów dla skoordynowanych działań wśród pojemników wydaje się nieudolnym zamknięciem. Zła praktyka? Może, ale przynajmniej tak to wyglądajeden oficjalny przykład.

pytaniaJakie jest właściwe rozwiązanie? Jeśli nie A lub B, to czy jest to coś, o czym nie myślałem?Dlaczego dev Qt pozwala QGraphicsItems na odbieranie zdarzeń, ale nie wysyłanie sygnałów? Wydaje się, że jest to główny wyjątek od wzorca projektowego stosowanego w ramach.Rozszerzeniem tego problemu jest komunikacja między QGraphicsItems a klasami kontenerów wyższego rzędu, jak główna aplikacja. Jak to ma być adresowane?

questionAnswers(2)

yourAnswerToTheQuestion