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有虚拟析构函数所以应该从内存中删除项目.
如果这不是正确的方法,我怎么能删除所有QGraphicsItem的QGraphicsScene?请注意,我知道删除场景后,所有项目也将被删除.但我想从场景中删除项目并绘制其他项目.我希望从内存中删除已删除的项目.
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)
你必须
#include <QGraphicsItem>
Run Code Online (Sandbox Code Playgroud)
在那个文件中.否则,编译器不知道QGraphicsItem它是什么,它有一个虚拟析构函数等.