根据QGraphicsItem destructor documentation,“在销毁物品之前从QGraphicsScene中移除物品效率更高。”
为什么?我想不出它会如何产生影响。如果它确实有所作为,那么QGraphicsItem析构函数不应该只调用:
if (scene() != NULL)
scene()->removeItem(this);
我查看了源代码,但事实并非如此,尽管有时我很难理解Qt源代码。 编辑:在jdi的回答中查看评论。
答案 0 :(得分:6)
也许我以不同于你的方式解释文档(我没有查看来源):
QGraphicsItem :: ~QGraphicsItem()[虚拟]
破坏QGraphicsItem 和它的所有孩子。如果此项目当前与a关联 场景,该项目将在删除之前从场景中删除 注意:从QGraphicsScene中删除项目效率更高 在销毁物品之前。
我认为这意味着它会在破坏之前将其从场景中移除,因为更有效。但是如果你说源代码没有表明发生这种情况,那么文档似乎是假的吗?
如果我不得不猜测为什么在销毁它之前首先删除项目会更有效(无论API是否真的在析构函数中为你做了),我认为它必须要做什么触发场景重新索引。也许通过删除仍在场景中的项目,子项目的级联删除将不断触发场景重新索引。然而,如果您要首先删除该项目,它可以以仅需要单个场景更新的方式有效地拉出整个层次结构,然后可以进行正常删除而不会进一步影响它?在场景中删除其他子事件/信号时,甚至可能会有更多级联效应。
我认为“注意”背后的逻辑是告知那些将子类化QGraphicsItem并重载析构函数的人,以记住首先需要从场景中删除。