2012-10-22 21 views
8

Nel mio progetto sto usando un QGraphicsScene e aggiungo/rimuovendo gli articoli su tutto il codice.Come ottenere le notifiche da QGraphicsScene su addItem o itemChange?

Ora voglio ricevere una notifica ogni volta che un QGraphicsItem viene aggiunto o rimosso. Molte classi Qt hanno segnali di notifica o almeno funzioni virtuali che vengono richiamate su tali cambiamenti. Sto cercando di evitare di aggiungere molte righe di codice in molti posti che non sono solo ingombranti ma anche non sicuri (dimenticando un inserimento/rimozione ora o in futuro).

Ho bisogno di una soluzione che funzioni con qualsiasi QGraphicsItem.

Questa è una lista di cose che non funzionano:

  • connessione a un segnale di QGraphicsScene(come in QAbstractItemModel::rowsInserted()) -> non c'è nessuno.
  • ereditato da QGraphicsScene e sovraccarico di una funzione di notificatore virtuale (come in QTabWidget::tabInserted()) -> non ce n'è.
  • ereditare e sovraccarico addItem(), l'invio di notifiche me stesso (come in QMdiArea::addSubWindow()) ->addItem non è virtuale e viene chiamato dai costruttori di QGraphicsItems.
  • installare i filtri eventi su appena aggiunto QGraphicsItems -> non ho idea di come ottenere l'elemento appena aggiunto E sarebbe un sceneEventFilter che può essere installato solo su altri QGraphicsItems.
  • connettersi a itemChange() di QGraphicsItem ->itemChange non è un segnale E il sovraccarico QGraphicsItem non è un'opzione.
  • involucro QGraphicsScene (avendo la scena come un membro privato) ed esporre solo le funzioni addItem e removeItem -> ma QGraphicsItems in quella scena poteva ancora accedervi tramite scene() funzione, quindi questa soluzione non è abbastanza sicuro.

Come posso ricevere le notifiche sulle modifiche alle voci?

Se c'è un modo semplice che ho semplicemente mancato, per favore indicatelo. Altrimenti, apprezzerei molto le idee su questo.

+0

Penso che il modo migliore sia solo per avvolgere QGraphicsScene e fornire la propria funzione 'addItem()' nel wrapper. – pmr

+0

È un peccato non poter sottoclasse 'QGraphicsItem' dato che tutte le modifiche alle scene (inclusa l'aggiunta/rimozione di scene) vengono eseguite attraverso il metodo' sceneEvent (QEvent * event) 'che fornisce una soluzione molto pulita e sintonizzabile al problema. – cmannett85

+0

@ pmr Come ho detto, la funzione 'addItem()' non è virtuale e viene chiamata dai costruttori di 'QGraphicsItem's. Quindi questa non sarebbe una soluzione completa. –

risposta

0

Penso che il meglio che si possa fare è connettersi al segnale QGraphicsScene::changed().

Non ti dirà quali articoli sono stati modificati/aggiunti/rimossi poiché è inteso per QGraphicsView per aggiornare il display. Ma dovresti essere in grado di scoprire usando le regioni fornite.