В моем проекте я использую QGraphicsScene
и добавляю/удаляю элементы по всему коду.
Теперь я хочу получать уведомления всякий раз, когда QGraphicsItem
добавляется или удаляется. Многие классы Qt имеют сигналы уведомления или, по крайней мере, виртуальные функции, которые вызываются при таких изменениях. Я пытаюсь избежать добавления большого количества строк кода во многих местах, что не только громоздко, но и небезопасно (забыть о вставке/удалении сейчас или в будущем).
Мне нужно решение, которое работает с любым QGraphicsItem
.
Это список вещей, которые не работают:
- подключиться к сигналу
QGraphicsScene
(как вQAbstractItemModel::rowsInserted()
) -> его нет. - наследовать от
QGraphicsScene
и перегрузить виртуальную функцию уведомления (как вQTabWidget::tabInserted()
) -> ее нет. - наследовать и перегружать
addItem()
, отправляя уведомления самому (как вQMdiArea::addSubWindow()
) ->addItem
не является виртуальным и вызывается из конструкторовQGraphicsItems
. - установить фильтры событий на недавно добавленный
QGraphicsItems
-> не знаю, как получить недавно добавленный элемент, И это будетsceneEventFilter
, который можно установить только на другомQGraphicsItems
. - подключение к
itemChange()
изQGraphicsItem
->itemChange
не является сигналом, И перегрузкаQGraphicsItem
невозможна. - оберните
QGraphicsScene
(имея сцену как частный член) и выставьте только функцииaddItem
иremoveItem
->, ноQGraphicsItems
в этой сцене все еще может получить к ней доступ через функциюscene()
, поэтому это решение недостаточно безопасно.
Как я могу получать уведомления об изменениях элементов?
Если есть простой способ, который я просто пропустил, пожалуйста, укажите мне на него. В противном случае я был бы очень признателен за идеи по этому поводу.
addItem()
в оболочке. - person pmr   schedule 22.10.2012QGraphicsItem
, так как все его изменения сцены (включая добавление/удаление сцены) выполняются через его методsceneEvent(QEvent* event)
, который обеспечивает очень чистое и настраиваемое решение вашей проблемы. - person cmannett85   schedule 22.10.2012addItem()
не является виртуальной и вызывается из конструкторовQGraphicsItem
s. Так что это будет не полное решение. - person Martin Hennings   schedule 22.10.2012QGraphicsObject
(который также используется), тем самым дублируя код. Хуже того, чтобы отправлять сигналы отQGraphicsItem
, мне также пришлось бы наследоваться отQObject
, что нарушает несколько иерархий наследования в моем проекте. - person Martin Hennings   schedule 22.10.2012scene()->removeItem(this)
- я все равно не смогу предотвратить это или, по крайней мере, получить уведомление об этом. - person Martin Hennings   schedule 22.10.2012