2012-05-02 13 views
10

De acuerdo con QGraphicsItem destructor documentation, "es más eficiente eliminar el elemento de QGraphicsScene antes de destruirlo".¿Por qué es más eficiente eliminar un QGraphicsItem de su escena antes de destruirlo?

¿Por qué es eso? No puedo pensar en cómo podría marcar la diferencia. Y si lo hizo hacer una diferencia, ¿no debería el destructor QGraphicsItem simplemente llame:

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

he comprobado la fuente, y esto no parece ser el caso, aunque a veces tengo un tiempo difícil entender fuente de Qt. EDITAR: ver los comentarios en la respuesta de jdi.

Respuesta

6

Tal vez estoy interpretando la documentación diferente de lo que (no he mirado en la fuente):

QGraphicsItem :: ~ QGraphicsItem() [virtual]
destruye la QGraphicsItem y todos sus hijos. Si este elemento está actualmente asociado con una escena , el elemento se eliminará de la escena antes de que se elimine.
Nota: es más eficaz eliminar el elemento de QGraphicsScene antes de destruir el elemento.

Y creo que esto significa que vaya a sacarlo de la escena antes de la destrucción de porque que es más eficiente. Pero si dices que la fuente no indica dónde ocurre esto, entonces ¿parece que los documentos serían falsos?

Si tuviera que adivinar por qué sería más eficiente eliminar el elemento primero antes de destruirlo (independientemente de si la API realmente lo hace por usted en el destructor), creo que tendría que hacer con lo que desencadena la escena para reindexar. Tal vez al eliminar un elemento que aún está en la escena, las eliminaciones en cascada de elementos secundarios activen constantemente la escena para reindexar. Considerando que, si primero quita el elemento, puede extraer de manera eficiente toda la jerarquía de una manera que solo requiera una única actualización de la escena, y luego la eliminación normal puede ocurrir sin afectarla aún más. Incluso puede haber más efectos en cascada de otros eventos/señales infantiles mientras se eliminan dentro de la escena.

Estoy apostando a que la lógica detrás de la "Nota" es informar a quienes subclasificarían un QGraphicsItem y sobrecargar el destructor para tener en cuenta la necesidad de eliminarlo primero de la escena.

+1

Gracias por eso. Revisé la fuente de nuevo y en realidad hay una línea que verifica si la escena existe, y si es así, llama a 'd_ptr-> scene-> d_func() -> removeItemHelper (this);'. Supongo que debe ser eso. Así que parece que tienes razón, que la nota podría ser un poco engañosa (o eso o soy un tonto). – Anthony

+0

@Anthony: voy a ir con engañoso :-). Los documentos están destinados a ser útiles, y si le resultaban confusos, entonces es una observación válida. Buen trabajo al verificar a través de la fuente para confirmar. – jdi

Cuestiones relacionadas