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 inQAbstractItemModel::rowsInserted()
) -> non c'è nessuno. - ereditato da
QGraphicsScene
e sovraccarico di una funzione di notificatore virtuale (come inQTabWidget::tabInserted()
) -> non ce n'è. - ereditare e sovraccarico
addItem()
, l'invio di notifiche me stesso (come inQMdiArea::addSubWindow()
) ->addItem
non è virtuale e viene chiamato dai costruttori diQGraphicsItems
. - installare i filtri eventi su appena aggiunto
QGraphicsItems
-> non ho idea di come ottenere l'elemento appena aggiunto E sarebbe unsceneEventFilter
che può essere installato solo su altriQGraphicsItems
. - connettersi a
itemChange()
diQGraphicsItem
->itemChange
non è un segnale E il sovraccaricoQGraphicsItem
non è un'opzione. - involucro
QGraphicsScene
(avendo la scena come un membro privato) ed esporre solo le funzioniaddItem
eremoveItem
-> maQGraphicsItems
in quella scena poteva ancora accedervi tramitescene()
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.
Penso che il modo migliore sia solo per avvolgere QGraphicsScene e fornire la propria funzione 'addItem()' nel wrapper. – pmr
È 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
@ pmr Come ho detto, la funzione 'addItem()' non è virtuale e viene chiamata dai costruttori di 'QGraphicsItem's. Quindi questa non sarebbe una soluzione completa. –