2012-10-22 7 views
8

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 w QAbstractItemModel::rowsInserted()) -> nie ma.
  • dziedziczy po QGraphicsScene i przeciąża funkcję wirtualnego zgłaszającego (jak w QTabWidget::tabInserted()) -> nie ma.
  • dziedziczą i przeciążeniowe addItem(), wysyłanie powiadomień myself (jak w QMdiArea::addSubWindow()) ->addItem nie jest wirtualny i jest wywoływana z konstruktorów QGraphicsItems.
  • zainstaluj filtry zdarzeń na nowo dodanym QGraphicsItems -> nie wiem, jak zdobyć nowo dodany element I będzie to sceneEventFilter, który może być zainstalowany tylko na innym QGraphicsItems.
  • połączyć z itemChange() z QGraphicsItem ->itemChange - nie jest sygnałem I przeciążenie QGraphicsItem nie jest opcją.
  • okład QGraphicsScene (o scenę jako prywatny członka) i tylko narazić funkcje addItem i removeItem -> ale QGraphicsItems w tej scenie może jeszcze do niego dostęp za pośrednictwem scene() 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.

+0

Myślę, że najlepszym sposobem jest po prostu owinięcie QGraphicsScene i dostarczenie własnej funkcji 'addItem()' w opakowaniu. – pmr

+0

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

+0

@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. –

Odpowiedz

0

Myślę, że najlepiej jest połączyć się z sygnałem QGraphicsScene::changed().

Nie będzie zawierał informacji o tym, które elementy zostały zmienione/dodane/usunięte, ponieważ jest przeznaczone dla QGraphicsView, aby zaktualizować wyświetlacz. Ale powinieneś być w stanie dowiedzieć się, korzystając z dostarczonych regionów.

Powiązane problemy