Qt 如何正确删除QGraphicsItem?

Qt 如何正确删除QGraphicsItem?,qt,Qt,我应该如何删除QGraphicsItem 从我使用的场景中删除项目 QGraphicsScene::removeItem(QGraphicsItem * item); 从该方法的文档中: i、 例如,QGraphicscene在销毁时将不再删除项目 所以我只看到一种方法: delete item; 但可能是另一个?例如,QWidget能够设置属性 setAttribute( Qt::WA_DeleteOnClose ); 这会导致删除该对象。QGraphicsSitem可能也有类似的功能

我应该如何删除QGraphicsItem

从我使用的场景中删除项目

 QGraphicsScene::removeItem(QGraphicsItem * item);
从该方法的文档中:

i、 例如,QGraphicscene在销毁时将不再删除项目

所以我只看到一种方法:

delete item;
但可能是另一个?例如,QWidget能够设置属性

setAttribute( Qt::WA_DeleteOnClose );
这会导致删除该对象。QGraphicsSitem可能也有类似的功能?

不幸的是,它是
QGraphicscene
中可用的所有图形项的基类,并且,与Qt中的大多数“类似项”的对象一样,不是从
QWidget
QObject
派生的。此外,它们只能作为另一个
qgraphicscene
的子对象(除了属于
qgraphicscene
之外)


从场景中删除项目后,除非它是另一个
QGraphicsItem
的父对象,否则Qt希望程序员通过显式调用
delete item;
手动删除该项目(或使用智能指针管理删除后项目的生存期).

这个问题似乎在今天持续了很长时间,而且还存在开放的bug

但它似乎有一个变通方法,我发现它很有用,经过数小时的调试、阅读和调查,我在这里找到了它:


这里还有一些关于图形场景的提示和技巧:

Item是QGraphics场景中所有项目的基类。由于它不是从QObject或QWidget派生的,我认为删除它(从场景中删除后)的正确方法就是调用
delete Item;
Item->deleteLater()
@martin\u pr或您可以使用。@ratchetfreak-这一点没有任何混淆,
deleteLater()
旨在安全地删除连接到事件循环的对象,以便在处理所有事件后进行删除。如果没有事件循环,则无需使用
deleteLater()
如果没有事件循环也不可能,因此您只需
删除
@martin\u pr是的,但您将只从一个类派生:如果您将
删除
放在智能指针中,例如
std::unique\u ptr
或Qt的任何智能指针类中,则不必显式调用它。@rubenvb-我想说显式使用智能poi仅将图形项的生存期与函数作用域绑定实际上比简单地手动删除它更费劲。除非您能给出一个示例,说明智能指针可以在图形项的整个生存期内管理图形项,而不仅仅是为了避免在图形项的最后手动删除。@rubenvb-所以您认为它是有效的ent存储指向每个项目的指针只是为了避免调用delete?考虑到场景/项目层次结构已经实现了“所有权”,这完全是多余的模型,尽管不是一个终生管理的模型。上帝禁止你有一个bug,你从智能指针向量中删除仍然在场景中的项目-坏的boom boom boom。从向量中删除指针和手动删除指针是一样的努力…你是那种“新建/删除是有害的和错误的,不应该使用”的人吗传道者?当然,我的坏。我的坏。我想<代码> ReaveItIs/CODE >应该返回指针,以便立即包装(或<代码>删除<代码> >),或者至少把它放在安全的地方。唉,QT的API与现代C++越来越冲突……但是,我是“不使用<代码>新< /COD> >代码>删除< /代码>福音传道者”。因为,嗯,异常安全和所有。嗯,还有+1个不使用智能指针的原因。我个人从不真正删除图形项目,只需将“已删除”项目移动到撤消队列,撤消队列本身决定何时需要清除历史步骤。