Возможно, я интерпретирую документы иначе, чем вы (я не смотрел источник):
QGraphicsItem::~QGraphicsItem () [виртуальный]
Уничтожает объект QGraphicsItem и все его дочерние элементы. Если этот элемент в настоящее время связан со сценой, он будет удален из сцены до того, как будет удален.
Примечание. Более эффективно удалить элемент из QGraphicsScene перед его уничтожением.
Я понимаю, что это означает, что он сначала удалит его со сцены, прежде чем уничтожить, потому что это более эффективно. Но если вы говорите, что источник нигде не указывает, что это происходит, то, похоже, документы будут ложными?
Если бы мне пришлось предположить, почему было бы более эффективно сначала удалить элемент перед его уничтожением (независимо от того, действительно ли API делает это за вас в деструкторе), я бы подумал, что это связано с тем, какие триггеры сцена для переиндексации. Возможно, при удалении элемента, который все еще находится в сцене, каскадное удаление дочерних элементов будет постоянно вызывать переиндексацию сцены. Принимая во внимание, что если вы сначала удалите элемент, он может эффективно извлечь всю иерархию таким образом, что потребуется только одно обновление сцены, а затем может произойти обычное удаление, не влияющее на нее? Может быть даже больше каскадных эффектов других дочерних событий/сигналов, когда они удаляются в сцене.
Бьюсь об заклад, логика «Примечания» заключается в том, чтобы информировать тех, кто будет создавать подкласс QGraphicsItem и перегружать деструктор, чтобы помнить о необходимости сначала удалить со сцены.
person
jdi
schedule
02.05.2012