Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 为什么在销毁QGraphicsItem之前将其从场景中删除会更有效?_Qt_Qgraphicsitem_Qgraphicsscene - Fatal编程技术网

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

Qt 为什么在销毁QGraphicsItem之前将其从场景中删除会更有效?,qt,qgraphicsitem,qgraphicsscene,Qt,Qgraphicsitem,Qgraphicsscene,根据“在销毁物品之前从Qgraphicscene中删除物品更有效。” 为什么呢?我想不出这会有什么不同。如果它确实起了作用,QGraphicsItem析构函数不应该调用: if (scene() != NULL) scene()->removeItem(this); 我检查了源代码,但情况似乎并非如此,尽管有时我很难理解Qt源代码编辑:查看jdi答案中的注释。也许我对文档的解释与您不同(我没有查看来源): QGraphicsItem::~QGraphicsItem()[虚拟] 破

根据“在销毁物品之前从Qgraphicscene中删除物品更有效。”

为什么呢?我想不出这会有什么不同。如果它确实起了作用,QGraphicsItem析构函数不应该调用:

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

我检查了源代码,但情况似乎并非如此,尽管有时我很难理解Qt源代码编辑:查看jdi答案中的注释。

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

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

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

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


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

谢谢。我再次检查了源代码,实际上有一行代码检查场景是否存在,如果存在,则调用
d_ptr->scene->d_func()->removietemhelper(这个)。我想一定是这样。看来你是对的,这张纸条可能有点误导人(要么就是这样,要么就是我是个傻瓜)。@Anthony:我要说的是误导:-)。文档是有帮助的,如果它让你感到困惑,那么它就是一个有效的观察。很好地通过来源进行检查以确认。