如何正确删除QGraphicsItem?

kaa*_*kaa 3 qt

删除QGraphicsItem应该怎么做?

从场景中删除项目

 QGraphicsScene::removeItem(QGraphicsItem * item);
Run Code Online (Sandbox Code Playgroud)

从文档中获取此方法:

即,QGraphicsScene在销毁时将不再删除项目

所以我只看到一种方法:

delete item;
Run Code Online (Sandbox Code Playgroud)

但是可能是另一个吗?例如对于QWidget能够设置属性

setAttribute( Qt::WA_DeleteOnClose );
Run Code Online (Sandbox Code Playgroud)

这导致删除对象。QGraphicsItem可能有类似的东西吗?

Mar*_*zak 5

不幸的是,QGraphicsItem是所有可用的内部图形项的基类QGraphicsScene,并且,作为Qt中大多数“类似项目”的对象,它不是从QWidget或派生的QObject。而且,它们只能是另一个父母的父母QGraphicsItem(除了由拥有QGraphicsScene

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

  • 啊,是的,当然,我的错。我的错。我认为“removeItem”应该返回指针,以便您可以立即将其包装(或“删除”它),或者至少将其放在安全的地方。唉,Qt 的 API 与现代 C++ 的冲突越来越多......但是,是的,我是一个“不要使用 `new`/`delete` 的传播者”,因为,嗯,异常安全等等。 (2认同)