Как удалить все QGraphicsItem из QGraphicsScene

я написал производный класс из QGraphicsScene. В какой-то момент мне нужно удалить все элементы со сцены, и я хочу, чтобы элементы были физически уничтожены (вызывается деструктор). Я попробовал следующее:

QList<QGraphicsItem*> all = items();
for (int i = 0; i < all.size(); i++)
{
    QGraphicsItem *gi = all[i];
    removeItem(gi);
    delete gi; // warning at this line
}

Qt Creator выдает предупреждение: warning: C4150: удаление указателя на неполный тип "QGraphicsItem"; деструктор не называется

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

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

3 ответов


вы можете удалить и удалить все элементы с QGraphicsScene:: clear ().


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

прежде всего, вам не нужно звонить QGraphicsScene::removeItem(). QGraphicsItem::~QGraphicsItem() делает это для вас.

во-вторых. Будьте осторожны, если вы положили любой QGraphicsItem внутри других. То есть, у вас есть предметы, которые дети других предметов. Разрушитель QGraphicsItem автоматически удалить все его дети. Поэтому, когда вы просматриваете элементы вернулся из QGraphicsScene, вы можете в конечном итоге удалить дочерний элемент, который уже был удален его родителем. Например, предположим, что у вас есть 2 элемента, A и B, А B является дочерним элементом A. При удалении A, B удаляется автоматически. А затем вы добираетесь до B и пытаетесь удалить его. Бум!

более безопасный способ сделать это-проверить, является ли элемент верхним уровнем, т. е. у него нет родителя:

QList<QGraphicsItem*> all = items();
for (int i = 0; i < all.size(); i++)
{
    QGraphicsItem *gi = all[i];
    if(gi->parentItem()==NULL) {
        delete gi;
    }
}

вы должны

#include <QGraphicsItem>

в этом файле. В противном случае, компилятор не знает, что QGraphicsItem, что он имеет виртуальный деструктор, и т. д.