2011-09-15 35 views
8

QGraphicsSceneから派生クラスを作成しました。ある時点で、シーンからすべてのアイテムを削除する必要があります。アイテムを物理的に破棄したい(デストラクタが呼び出されます)。私は、次を試してみました:警告:C4150:QGraphicsSceneからすべてのQGraphicsItemを削除する方法

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は警告発する不完全型へのポインタの削除「をQGraphicsItem」。デストラクタは呼ばれません

私はなぜそれが分かりません。 QGraphicsItemには仮想デストラクタがあるため、メモリからアイテムを削除する必要があります。

これが正しい方法でない場合、QGraphicsItemをすべてQGraphicsSceneから削除するにはどうすればよいですか?シーンが削除されると、すべてのアイテムも削除されます。しかし、私はシーンからアイテムを削除し、他のアイテムを描画したい。削除したアイテムをメモリから削除したい。

答えて

7

あなたは、そのファイルに

#include <QGraphicsItem> 

に持っています。そうしないと、コンパイラは、ヘッダファイルが欠落している、jpalecekが指摘

9

のようになど、それは仮想デストラクタを持っていることを、QGraphicsItemが何であるかを知りません。あなたは彼の答えを受け入れるべきです。私はちょうど2つの潜在的な問題を指摘するつもりです:

まず、QGraphicsScene::removeItem()に電話する必要はありません。 QGraphicsItem::~QGraphicsItem()あなたのためにそれを行います。

次に。 QGraphicsItemを他の人の中に入れると注意が必要です。つまり、他のアイテムの子であるアイテムがあります。 QGraphicsItemのデストラクタは自動的にすべての子を削除します。したがって、QGraphicsSceneから返されたアイテムをループすると、親によって既に削除されている子アイテムが削除されることがあります。たとえば、AとBの2つの項目があり、BがAの子であるとします.Aを削除するとBが自動的に削除されます。そして、あなたはBに行き、それを削除しようとします。ブーム!これを行うには

安全な方法は、アイテムがトップレベル1であるかどうかをテストすることで、すなわちそれは親を持ちません。

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