为什么在销毁之前从场景中删除QGraphicsItem更有效?

时间:2012-05-02 20:56:23

标签: qt qgraphicsitem qgraphicsscene

根据QGraphicsItem destructor documentation,“在销毁物品之前从QGraphicsScene中移除物品效率更高。”

为什么?我想不出它会如何产生影响。如果它确实有所作为,那么QGraphicsItem析构函数不应该只调用:

if (scene() != NULL)
    scene()->removeItem(this);

我查看了源代码,但事实并非如此,尽管有时我很难理解Qt源代码。 编辑:在jdi的回答中查看评论。

1 个答案:

答案 0 :(得分:6)

也许我以不同于你的方式解释文档(我没有查看来源):

  

QGraphicsItem :: ~QGraphicsItem()[虚拟]
  破坏QGraphicsItem   和它的所有孩子。如果此项目当前与a关联   场景,该项目将在删除之前从场景中删除   注意:从QGraphicsScene中删除项目效率更高   在销毁物品之前。

我认为这意味着它会在破坏之前将其从场景中移除,因为更有效。但是如果你说源代码没有表明发生这种情况,那么文档似乎是假的吗?

如果我不得不猜测为什么在销毁它之前首先删除项目会更有效(无论API是否真的在析构函数中为你做了),我认为它必须要做什么触发场景重新索引。也许通过删除仍在场景中的项目,子项目的级联删除将不断触发场景重新索引。然而,如果您要首先删除该项目,它可以以仅需要单个场景更新的方式有效地拉出整个层次结构,然后可以进行正常删除而不会进一步影响它?在场景中删除其他子事件/信号时,甚至可能会有更多级联效应。

我认为“注意”背后的逻辑是告知那些将子类化QGraphicsItem并重载析构函数的人,以记住首先需要从场景中删除。