В моя проект използвам QGraphicsScene
и добавям/премахвам елементи в целия код.
Сега искам да получавам известия, когато QGraphicsItem
бъде добавено или премахнато. Много Qt класове имат сигнали за уведомяване или поне виртуални функции, които се извикват при такива промени. Опитвам се да избегна добавянето на много редове код на много места, което е не само тромаво, но и опасно (забравяне на вмъкване/премахване сега или в бъдеще).
Имам нужда от решение, което работи с всеки QGraphicsItem
.
Това е списък с неща, които не работят:
- свържете се към сигнал на
QGraphicsScene
(както вQAbstractItemModel::rowsInserted()
) -> няма такъв. - наследява от
QGraphicsScene
и претоварва функция за виртуално уведомяване (както вQTabWidget::tabInserted()
) -> няма такава. - наследявам и претоварвам
addItem()
, изпращам известия сам (както вQMdiArea::addSubWindow()
) ->addItem
не е виртуален и се извиква от конструкторите наQGraphicsItems
. - инсталирайте филтри за събития на новодобавен
QGraphicsItems
-> нямам идея как да получа новодобавения елемент И това ще бъдеsceneEventFilter
, който може да се инсталира само на другиQGraphicsItems
. - свързване към
itemChange()
отQGraphicsItem
->itemChange
не е сигнал И претоварванетоQGraphicsItem
не е опция. - wrap
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