10

According to the QGraphicsItem destructor documentation, "It is more efficient to remove the item from the QGraphicsScene before destroying the item."

Why is that? I can't think of how it could make a difference. And if it did make a difference, shouldn't the QGraphicsItem destructor just call:

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

I checked the source, and this does not seem to be the case, although sometimes I have a tough time understanding Qt source. EDIT: See comments in jdi's answer.

4

1 回答 1

6

也许我对文档的解释与您不同(我没有查看源代码):

QGraphicsItem::~QGraphicsItem () [虚拟]
销毁 QGraphicsItem 及其所有子项。如果该项目当前与场景相关联,则该项目将在删除之前从场景中移除。
注意:在销毁项目之前从 QGraphicsScene 中删除项目更有效。

我认为这意味着它会在销毁之前先将其从场景中移除,因为这样更有效。但是,如果您说来源没有指出发生这种情况的任何地方,那么文档似乎是错误的?

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

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

于 2012-05-02T21:04:49.390 回答