W moim projekcie używam elementu QGraphicsScene
i dodawania/usuwania elementów całego kodu.Jak uzyskać powiadomienia z QGraphicsScene na addItem lub itemChange?
Teraz chcę otrzymywać powiadomienia o dodaniu lub usunięciu numeru QGraphicsItem
. Wiele klas Qt ma sygnały powiadomień lub co najmniej funkcje wirtualne, które są wywoływane przy takich zmianach. Próbuję uniknąć dodawania wielu wierszy kodu w wielu miejscach, co jest nie tylko kłopotliwe, ale także niebezpieczne (zapominając o wstawieniu/usunięciu teraz lub w przyszłości).
Potrzebuję rozwiązania, które działa z każdym QGraphicsItem
.
Jest to lista rzeczy, które nie działają:
- połączyć sygnał
QGraphicsScene
(jak wQAbstractItemModel::rowsInserted()
) -> nie ma. - dziedziczy po
QGraphicsScene
i przeciąża funkcję wirtualnego zgłaszającego (jak wQTabWidget::tabInserted()
) -> nie ma. - dziedziczą i przeciążeniowe
addItem()
, wysyłanie powiadomień myself (jak wQMdiArea::addSubWindow()
) ->addItem
nie jest wirtualny i jest wywoływana z konstruktorówQGraphicsItems
. - zainstaluj filtry zdarzeń na nowo dodanym
QGraphicsItems
-> nie wiem, jak zdobyć nowo dodany element I będzie tosceneEventFilter
, który może być zainstalowany tylko na innymQGraphicsItems
. - połączyć z
itemChange()
zQGraphicsItem
->itemChange
- nie jest sygnałem I przeciążenieQGraphicsItem
nie jest opcją. - okład
QGraphicsScene
(o scenę jako prywatny członka) i tylko narazić funkcjeaddItem
iremoveItem
-> aleQGraphicsItems
w tej scenie może jeszcze do niego dostęp za pośrednictwemscene()
funkcji, więc to rozwiązanie nie jest wystarczająco bezpieczny.
Jak mogę otrzymywać powiadomienia o zmianach pozycji?
Jeśli istnieje prosty sposób, który po prostu przegapiłem, proszę wskazać mi to. W przeciwnym razie bardzo bym to doceniła.
Myślę, że najlepszym sposobem jest po prostu owinięcie QGraphicsScene i dostarczenie własnej funkcji 'addItem()' w opakowaniu. – pmr
To wstyd, że nie można podklasować 'QGraphicsItem', ponieważ wszystkie jego zmiany w scenie (w tym dodawanie/usuwanie scen) przebiegają przez jego metodę' sceneEvent (QEvent * event) ', która zapewnia bardzo czyste i przestrajalne rozwiązanie twojego problemu. – cmannett85
@pmr Jak już powiedziałem, funkcja 'addItem()' nie jest wirtualna i jest wywoływana z konstruktorów 'QGraphicsItem's. Więc nie byłoby to kompletne rozwiązanie. –