2011-09-15 14 views
8

Ho scritto una classe derivata da QGraphicsScene. A un certo punto ho bisogno di rimuovere tutti gli oggetti dalla scena e voglio che gli oggetti siano fisicamente distrutti (chiamato distruttore). Ho provato la seguente:Come eliminare tutto QGraphicsItem da QGraphicsScene

QList<QGraphicsItem*> all = items(); 
for (int i = 0; i < all.size(); i++) 
{ 
    QGraphicsItem *gi = all[i]; 
    removeItem(gi); 
    delete gi; // warning at this line 
} 

Qt Creator emette un avviso: avviso: C4150: soppressione del puntatore al tipo incompleto 'QGraphicsItem'; nessun distruttore chiamato

Non sono sicuro del perché. QGraphicsItem dispone di distruttore virtuale per cui gli elementi devono essere eliminati dalla memoria.

Se questo non è il modo giusto, come posso cancellare tutti i QGraphicsItem s da QGraphicsScene? Si noti che so quando la scena viene cancellata, tutti gli elementi verranno eliminati. Ma voglio rimuovere gli oggetti dalla scena e disegnare altri oggetti. Voglio che gli elementi rimossi vengano cancellati dalla memoria.

risposta

7

dovete

#include <QGraphicsItem> 

in quel file. In caso contrario, il compilatore non so cosa QGraphicsItem è, che ha un distruttore virtuale, ecc

9

Come jpalecek sottolineato, vi manca il file di intestazione. Dovresti accettare la sua risposta. Vorrei solo evidenziare due potenziali problemi:

Prima di tutto, non è necessario chiamare QGraphicsScene::removeItem(). QGraphicsItem::~QGraphicsItem() lo fa per te.

In secondo luogo. Fai attenzione se inserisci uno QGraphicsItem all'interno di altri. Cioè, hai oggetti che sono figli di altri oggetti. Il distruttore di QGraphicsItem elimina automaticamente tutti i suoi figli. Pertanto, quando esegui il loop degli articoli restituiti da QGraphicsScene, potresti finire per eliminare un elemento figlio che è già stato eliminato dal relativo genitore. Ad esempio, supponiamo di avere 2 elementi, A e B, e B è figlio di A. Quando elimini A, B viene eliminato automaticamente. E poi arrivi a B e prova ad eliminarlo. BOOM!

Un modo più sicuro per farlo è quello di testare se l'articolo è il livello più alto uno, vale a dire non ha genitore:

QList<QGraphicsItem*> all = items(); 
for (int i = 0; i < all.size(); i++) 
{ 
    QGraphicsItem *gi = all[i]; 
    if(gi->parentItem()==NULL) { 
     delete gi; 
    } 
} 
Problemi correlati