Qt 为什么在销毁QGraphicsItem之前将其从场景中删除会更有效?
根据“在销毁物品之前从Qgraphicscene中删除物品更有效。” 为什么呢?我想不出这会有什么不同。如果它确实起了作用,QGraphicsItem析构函数不应该调用:Qt 为什么在销毁QGraphicsItem之前将其从场景中删除会更有效?,qt,qgraphicsitem,qgraphicsscene,Qt,Qgraphicsitem,Qgraphicsscene,根据“在销毁物品之前从Qgraphicscene中删除物品更有效。” 为什么呢?我想不出这会有什么不同。如果它确实起了作用,QGraphicsItem析构函数不应该调用: if (scene() != NULL) scene()->removeItem(this); 我检查了源代码,但情况似乎并非如此,尽管有时我很难理解Qt源代码编辑:查看jdi答案中的注释。也许我对文档的解释与您不同(我没有查看来源): QGraphicsItem::~QGraphicsItem()[虚拟] 破
if (scene() != NULL)
scene()->removeItem(this);
我检查了源代码,但情况似乎并非如此,尽管有时我很难理解Qt源代码编辑:查看jdi答案中的注释。也许我对文档的解释与您不同(我没有查看来源): QGraphicsItem::~QGraphicsItem()[虚拟]
破坏QGraphicsItem 和它所有的孩子。如果此项目当前与 场景中,项目将在删除之前从场景中删除。
注意:从QGraphicscene中删除该项更有效 在销毁物品之前 我认为这意味着它将在销毁之前首先将其从场景中删除,因为更有效。但是如果你说来源没有指出任何地方发生了这种情况,那么这些文档似乎是假的 如果我不得不猜测为什么在销毁该项之前先删除该项会更有效(不管API是否真的在析构函数中为您执行该操作),我会认为这与触发场景重新索引有关。可能通过删除仍在场景中的项目,子项目的级联删除会不断触发场景重新编制索引。然而,如果您要先删除该项目,它可能会以只需要对场景进行一次更新的方式有效地拉出整个层次,然后可以在不进一步影响它的情况下进行正常删除?在场景中删除其他子事件/信号时,它们甚至可能会产生更多的级联效果
我敢打赌,“注释”背后的逻辑是通知那些将QGraphicsItem子类化并重载析构函数的人,记住需要首先从场景中删除。谢谢。我再次检查了源代码,实际上有一行代码检查场景是否存在,如果存在,则调用
d_ptr->scene->d_func()->removietemhelper(这个)代码>。我想一定是这样。看来你是对的,这张纸条可能有点误导人(要么就是这样,要么就是我是个傻瓜)。@Anthony:我要说的是误导:-)。文档是有帮助的,如果它让你感到困惑,那么它就是一个有效的观察。很好地通过来源进行检查以确认。