Подтвердить что ты не робот

Почему более эффективно удалять QGraphicsItem со сцены, прежде чем уничтожить его?

В соответствии с документацией QGraphicsItem деструктора: "Эффективно удалить элемент из QGraphicsScene, прежде чем уничтожить элемент".

Почему? Я не могу придумать, как это может измениться. И если это действительно имеет значение, не должен вызывать деструктор QGraphicsItem:

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

Я проверил источник, и, похоже, это не так, хотя иногда мне трудно понять Qt-источник. EDIT: см. комментарии в ответе jdi.

4b9b3361

Ответ 1

Возможно, я интерпретирую документы иначе, чем вы (я не смотрел на источник):

QGraphicsItem:: ~ QGraphicsItem() [виртуальный]
Уничтожает QGraphicsItem и всех его детей. Если этот элемент в настоящее время связан с сцена, элемент будет удален со сцены до его удаления.
Примечание. Эффективнее удалить элемент из QGraphicsScene. прежде чем уничтожить элемент.

Я полагаю, что это означает, что он удалит его со сцены сначала, прежде чем уничтожить , потому что будет более эффективным. Но если вы говорите, что источник не указывает нигде, что это происходит, то кажется, что документы будут ложными?

Если бы я должен был предположить, почему было бы более эффективно удалить элемент сначала, прежде чем уничтожить его (независимо от того, действительно ли API делает это для вас в деструкторе), я бы подумал, что это нужно будет сделать с тем, что запускает сцену для переиндексации. Возможно, удалив элемент, который все еще находится на сцене, каскадные удаления дочерних элементов будут постоянно вызывать переопределение сцены. Принимая во внимание, что если вы сначала должны удалить элемент, он может эффективно вытащить всю иерархию таким образом, чтобы требовалось только одно обновление сцены, а затем может произойти нормальное удаление без дальнейшего воздействия на него? Там могут быть даже более каскадные эффекты других дочерних событий/сигналов, когда они удаляются внутри сцены.

Я делаю ставку на логику "Примечание", чтобы сообщить тем, кто будет подклассифицировать QGraphicsItem и перегрузить деструктор, чтобы иметь в виду необходимость сначала удалить из сцены.