2011-09-15 16 views
8

QGraphicsScene'dan türetilmiş bir sınıf yazdım. Bir noktada, sahneden bütün eşyaları çıkarmam gerekiyor ve ben de fiziksel olarak imha edilmelerini istiyorum (yıkıcı denir). I güvenilir aşağıdaki gibidir: uyarı: C4150:QGraphicsScene sitesinden tüm QGraphicsItem nasıl silinir

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 bir uyarı verir eksik türü 'QGraphicsItem' işaretçi silme;

adı verilen hiçbir yıkıcı neden olmadığından emin değilim. QGraphicsItem, sanal yıkıcıya sahiptir, böylece öğeler bellekten silinmelidir.

Bu doğru yol değilse, QGraphicsScene numaralı telefondan tüm QGraphicsItem s dosyalarını nasıl silebilirim? Sahnenin ne zaman silineceğini bildiğimi, tüm öğelerin de silineceğini unutmayın. Ama öğeleri sahneden kaldırmak ve diğer öğeleri çizmek istiyorum. Kaldırılan öğelerin bellekten silinmesini istiyorum.

cevap

7

O dosyada

#include <QGraphicsItem> 

gerekiyor. Aksi takdirde, derleyici üstbilgi dosyası eksik, jpalecek işaret

9

gibi vs, bu sanal yıkıcı olduğunu, QGraphicsItem ne olduğunu bilmiyor. Cevabını kabul etmelisin. Sadece iki potansiyel konuya dikkat çekeceğim:

Her şeyden önce, QGraphicsScene::removeItem()'u aramanıza gerek yoktur. QGraphicsItem::~QGraphicsItem() bunu sizin için yapar. İkincisi, ikinci olarak,

. Başkalarının içine herhangi bir QGraphicsItem koyarsanız dikkatli olun. Yani, diğer öğelerin çocukları olan öğeleriniz var. QGraphicsItem'un yıkıcısı tüm çocuklarını otomatik olarak siler. Bu nedenle, QGraphicsScene'dan döndürülen öğeler arasında geçiş yaptığınızda, ebeveyn tarafından zaten silinmiş bir alt öğeyi silebilirsiniz. Örneğin, A ve B olmak üzere 2 öğeniz olduğunu ve B'nin A'nın alt öğesi olduğunu varsayalım. A'yı sildiğinizde, B otomatik olarak silinir. Ve sonra B'ye gidip onu silmeye çalışın. BOOM!

Bunu yapmanın daha kolay yolu öğesi üst düzey biriyse, test etmektir, yani üstü yoktur:

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