【问题标题】:How to delete QGraphicsItem properly?如何正确删除 QGraphicsItem?
【发布时间】:2014-11-28 12:19:48
【问题描述】:

我应该怎么做才能删除 QGraphicsItem?

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

 QGraphicsScene::removeItem(QGraphicsItem * item);

来自此方法的文档:

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

所以我只看到一种方式:

delete item;

但可能是另一个?例如 QWidget 可以设置属性

setAttribute( Qt::WA_DeleteOnClose );

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

【问题讨论】:

  • Item 是 QGraphics 场景中所有项目的基类。由于它不是从 QObject 或 QWidget 派生的,我相信删除它的正确方法(从场景中删除后)只是调用 delete item;
  • item->deleteLater()
  • @martin_pr 或者你可以使用QGraphicsObject
  • @ratchetfreak - 这没有什么令人困惑的地方,deleteLater() 旨在安全地删除连接到事件循环的对象,以便在处理完所有事件后进行删除。如果没有事件循环,则不需要使用deleteLater(),也不可能没有事件循环,所以你只需delete
  • @martin_pr 是的,但你只会从一个类派生:P

标签: qt


【解决方案1】:

不幸的是,QGraphicsItemQGraphicsScene 中可用的所有图形项的基类,并且与 Qt 中的大多数“类项”对象一样,它不是从QWidgetQObject 派生的。此外,它们只能是另一个 QGraphicsItem 的父级(除了由 QGraphicsScene 拥有。

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

【讨论】:

  • 如果您将delete 放入智能指针(如std::unique_ptr 或任何Qt 的智能指针类)中,则您没有必须显式调用它。
  • @rubenvb - 我要明确地说,使用智能指针只是为了将图形项的生命周期与函数范围联系起来,实际上比简单地手动删除它更费力。除非你能举一个例子,智能指针可以在其整个生命周期内管理图形项,而不仅仅是为了避免在最后手动删除。
  • @rubenvb - 所以你建议存储指向每个项目的指针只是为了避免调用删除是有效的?考虑到场景/项目层次结构已经实现了“所有权”模型,这完全是多余的,尽管不是终生管理的。上帝保佑你有一个错误,你从智能指针向量中删除仍然在场景中的项目 - 糟糕的繁荣繁荣。从向量中删除指针与手动删除是一样的努力......你是那些“新/删除是有害和错误的,不应该使用”的传道者之一吗?
  • 啊,是的,当然,我的错。我的错。我认为removeItem 应该返回指针,这样你就可以立即将它包装起来(或delete 它),或者至少把它放在安全的地方。唉,Qt 的 API 与现代 C++ 的冲突越来越多……但是,是的,我是“不要使用 new/delete 传播者”,因为,嗯,异常安全等等。
  • 好吧,还有 1 个不使用智能指针的理由。我个人从不真正删除图形项,只是将“已删除”项移动到撤消队列,该队列本身决定何时需要将历史记录步骤清除。
【解决方案2】:

这个问题今天似乎持续了很长时间,而且还有一些未解决的错误。

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

https://forum.qt.io/topic/71316/qgraphicsscenefinditembsptreevisitor-visit-crashes-due-to-an-obsolete-paintevent-after-qgraphicsscene-removeitem/17

这里有一些关于图形场景的其他提示和技巧:https://tech-artists.org/t/qt-properly-removing-qgraphicitems/3063/6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2012-10-03
    • 1970-01-01
    相关资源
    最近更新 更多