Как и другие примитивы в Qt, QGraphicsItems могут обрабатывать события мыши и т.п. Милая! Теперь скажите, что мне нужно, чтобы событие на одном QGraphicsItem распространялось на некоторые другие объекты QGraphicsItems в одной и той же сцене. Я могу думать о двух способах, которые можно было бы подойти к этому:
(A) Наивный подход - сигнализация
Концепция: Соединяйте sigling QGraphicsItems вместе с сигналами. Обработчики событий на QGraphicsItem вызывают emit() s, которые вызывают согласованные ответы на другие QGraphicItems. Это следует за общей схемой проектирования, установленной в рамках Qt.
Реализация: По причинам, которые я не полностью понимаю, QGraphicsItems не могут генерировать() сигналы. Было высказано предположение, что производные классы, которые также наследуются от QGraphicsObject, могут обойти это. Мне кажется, что исключение emit() в QGraphicsItems было, вероятно, преднамеренным дизайнерским решением со стороны разработчиков Qt, и поэтому множественное наследование, вероятно, не является правильным решением.
(B) Обработка событий на уровне контейнера
Концепция: QGraphicsItems всегда существуют в контексте контейнера типа QGraphicsScene. События, выполняемые в (A) на уровне QGraphicsItem, обрабатываются объектом, наследующим от QGraphicsScene. Этот объект также реализует логику для координации ответов между sigling QGraphicsItems.
Реализация: QGraphicsScene определенно имеет возможность обрабатывать события, которые в противном случае могли бы перейти к QGraphicsItems. QGraphicsScene также предоставляет метод itemsAt() для определения того, какие из вещей в нем затронуты позиционными событиями, такими как щелчки мыши. Тем не менее, создание значительной логики в классе контейнера для согласованных действий между хранителями чувств похоже на неспособность инкапсуляции должным образом. Плохая практика? Возможно, но это похоже на то, как это делается, по крайней мере, один официальный пример.
Вопросы
- Какое правильное решение здесь? Если не A или B, то это что-то еще, о чем я не думал?
- Почему разработчики Qt позволяют QGraphicsItems получать события, но не отправлять сигналы? Это похоже на основное исключение из шаблона проектирования, используемого во всей структуре.
- Расширением этой проблемы является связь между QGraphicsItems и классами контейнеров более высокого порядка, такими как основное приложение. Как это должно быть адресовано?