Eventos e sinais no QGraphicsItem do Qt: Como isso * deveria * funcionar?

Como outros primitivos no Qt, o QGraphicsItems pode manipular eventos de mouse e similares. Doce! Agora, digamos que eu precise de um evento em um QGraphicsItem para ser propagado para alguns outros QGraphicsItems na mesma cena. Posso pensar em duas maneiras pelas quais alguém pode abordar isso:

(A) A abordagem ingênua - Sinalização

Conceito : Conecte os irmãos QGraphicsItems a sinais. Os manipuladores de eventos no QGraphicsItem chamam emit () s que evocam respostas coordenadas em outros QGraphicItems. Isso segue o padrão geral de design estabelecido em todo o framework Qt.

Implementação: Por motivos que não entendo completamente, os QGraphicsItems não podem emitir sinais ().Isso foi sugerido que classes derivadas que também herdam de QGraphicsObject podem ser capazes de contornar isso. Parece-me, no entanto, que a exclusão de emit () em QGraphicsItems foi provavelmente uma decisão de design intencional por parte dos desenvolvedores de Qt e, portanto, a herança múltipla provavelmente não é a Solução Certa.

(B) Manipulação de Eventos no Nível de Contêiner

Conceito : QGraphicsItems sempre existem no contexto de um container do tipo QGraphicsScene. Os eventos que em (A) foram manipulados no nível do QGraphicsItem são manipulados por um objeto herdado de QGraphicsScene. Este objeto também implementa a lógica para coordenar respostas entre os QGraphicsItems irmãos.

Implementação: O QGraphicsScene definitivamente tem a capacidade de lidar com eventos que, de outra forma, seriam transferidos para o QGraphicsItems. QGraphicsScene também fornece o método itemsAt () para determinar quais das coisas são afetadas por eventos posicionais, como cliques do mouse. Ainda assim, a criação de uma lógica considerável em uma classe de contêineres para ação coordenada entre contêineres parece uma falha em encapsular adequadamente. Mau prática? Talvez, mas esta parece ser a maneira que é feito pelo menosum exemplo oficial.

QuestõesQual é a solução certa aqui? Se não A ou B, então é algo que eu não tenho pensado?Por que o Qt devs permitiu que QGraphicsItems recebesse eventos, mas não enviasse sinais? Isso parece uma grande exceção ao padrão de design usado em todo o framework.Uma extensão desse problema é a comunicação entre QGraphicsItems e classes de contêineres de ordem superior, como o aplicativo principal. Como isso deve ser abordado?

questionAnswers(2)

yourAnswerToTheQuestion