2012-05-02 21 views
10

Secondo lo QGraphicsItem destructor documentation, "È più efficiente rimuovere l'elemento da QGraphicsScene prima di distruggere l'oggetto."Perché è più efficiente rimuovere un oggetto QGraphics dalla sua scena prima di distruggerlo?

Perché è quello? Non riesco a pensare a come potrebbe fare la differenza. E se lo ha fatto fare la differenza, non dovrebbe il distruttore QGraphicsItem basta chiamare:

if (scene() != NULL) 
    scene()->removeItem(this); 

ho controllato la fonte, e questo non sembra essere il caso, anche se a volte ho un momento difficile comprensione fonte Qt. MODIFICA: Vedere i commenti nella risposta di jdi.

risposta

6

Forse sto interpretando i documenti in modo diverso di quanto si (non ho guardato alla fonte):

QGraphicsItem :: ~ QGraphicsItem() [virtuale]
distrugge la QGraphicsItem e tutti i suoi figli. Se questo elemento è attualmente associato a una scena , l'elemento verrà rimosso dalla scena prima che venga eliminato.
Nota: è più efficiente rimuovere l'elemento da QGraphicsScene prima di distruggere l'elemento.

Lo prendo a significare che lo rimuoverà dalla scena prima di distruggere perché che è più efficiente. Ma se dici che la fonte non indica da nessuna parte che ciò accada, allora sembra che i documenti siano falsi?

Se dovessi indovinare il motivo per cui sarebbe più efficiente rimuovere l'oggetto prima di distruggerlo (indipendentemente dal fatto che l'API lo faccia davvero nel distruttore), penserei che sarebbe necessario fare con ciò che attiva la scena di reindicizzare. Forse eliminando un oggetto che è ancora nella scena, le delezioni a catena degli elementi figlio attirerebbero costantemente la scena alla reindicizzazione. Considerando che, se si desidera rimuovere prima l'elemento, è possibile estrarre in modo efficiente l'intera gerarchia in un modo che richiede solo un singolo aggiornamento della scena, e quindi la normale cancellazione può verificarsi senza ulteriori effetti su di essa? Potrebbero esserci anche più effetti a cascata di altri eventi/segnali figlio mentre vengono cancellati all'interno della scena.

Scommetto che la logica dietro la "Nota" è di informare coloro che vorrebbe sottoclasse un oggetto QGraphics e sovraccaricare il distruttore per tenere a mente la necessità di rimuovere prima la scena.

+1

Grazie per quello. Ho controllato di nuovo la fonte e in realtà c'è una linea che controlla se la scena esiste, e in tal caso, chiama 'd_ptr-> scene-> d_func() -> removeItemHelper (this);'. Immagino che debba essere così. Quindi sembra che tu abbia ragione, che la nota potrebbe essere un po 'fuorviante (o quello o io sono un doofus). – Anthony

+0

@Anthony: Sto andando semplicemente a ingannare :-). I documenti sono pensati per essere utili, e se ti confondeva, allora è una osservazione valida. Buon lavoro nel controllare attraverso la fonte per confermare. – jdi