如何从QGraphicsScene中删除所有QGraphicsItem

Don*_*alo 10 c++ qt incomplete-type

我写了一个派生类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
}
Run Code Online (Sandbox Code Playgroud)

Qt Creator发出警告:警告:C4150:删除指向不完整类型'QGraphicsItem'的指针; 没有破坏者叫

我不知道为什么会这样.QGraphicsItem有虚拟析构函数所以应该从内存中删除项目.

如果这不是正确的方法,我怎么能删除所有QGraphicsItemQGraphicsScene?请注意,我知道删除场景后,所有项目也将被删除.但我想从场景中删除项目并绘制其他项目.我希望从内存中删除已删除的项目.

ale*_*sdm 18

您可以使用QGraphicsScene :: clear()删除和删除所有项目.


Ste*_*Chu 10

就像jpalecek指出的那样,你缺少头文件.你应该接受他的回答.我只想指出两个潜在的问题:

首先,你不需要打电话QGraphicsScene::removeItem().QGraphicsItem::~QGraphicsItem()为你这样做.

其次.如果你把任何人QGraphicsItem放在别人的内心,要小心.也就是说,您有其他项目的子项.析构函数QGraphicsItem自动删除其所有子节点.因此,当您遍历从中返回的项目时QGraphicsScene,您最终可能会删除已被其父项删除的子项目.例如,假设您有2个项目,A和B,B是A的子项.删除A时,B会自动删除.然后你到达B并尝试删除它.繁荣!

更安全的方法是测试项目是否为顶级项目,即它没有父项:

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


jpa*_*cek 7

你必须

#include <QGraphicsItem>
Run Code Online (Sandbox Code Playgroud)

在那个文件中.否则,编译器不知道QGraphicsItem它是什么,它有一个虚拟析构函数等.