根据
QGraphicsItem destructor documentation,“在销毁该项目之前,从QGraphicsScene中删除该项目更为有效.”
这是为什么?我不能想像如何才能有所作为.而如果它确实有所作为,那么QGraphicsItem析构函数应该不会调用:
if (scene() != NULL) scene()->removeItem(this);
我检查了源码,这似乎并不是这样,虽然有时候我很难理解Qt源码.编辑:见jdi的回答.
解决方法
也许我正在解释文档与你不同(我没有看过来源):
QGraphicsItem::~QGraphicsItem () [virtual]
Destroys the QGraphicsItem
and all its children. If this item is currently associated with a
scene,the item will be removed from the scene before it is deleted.
Note: It is more efficient to remove the item from the QGraphicsScene
before destroying the item.
我认为这是因为它会在摧毁之前首先从场景中删除,因为这样更有效率.但是如果你说来源不表示发生这种情况,那么文件似乎是假的?
如果我不得不猜测为什么在摧毁它之前首先删除该项目会更有效(不管API是否真的为您在析构函数中执行),我认为这将与什么触发器有关reindex的场景.也许通过删除仍在场景中的项目,子项目的级联删除会不断地触发场景重新索引.而如果您要先删除该项目,则可以以仅需要单次更新场景的方式有效地拉出整个层次结构,然后可以进行正常删除而不会进一步影响?在场景中删除其他子事件/信号甚至可能会有更多的级联效应.
我注意到“注意”背后的逻辑是通知那些将子类化QGraphicsItem并重载析构函数的人,以便记住需要首先从场景中删除.