Как удалить все 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 ответов
как 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
, что он имеет виртуальный деструктор, и т. д.