Сбой после QGraphicsScene:: removeItem () с пользовательским классом элементов
Я заполняю QGraphicsScene
экземплярами пользовательского класса элементов (наследуя QGraphicsPathItem
). В какой-то момент во время выполнения я пытаюсь удалить элемент (плюс его дочерние элементы) из сцены, вызывая:
delete pItem;
Это автоматически вызывает QGraphicsScene::removeItem()
, однако это также приводит к сбою в классе QGraphicsSceneFindItemBspTreeVisitor
во время следующей перерисовки.
2 ответа:
TL; DR: решение состоит в том, чтобы гарантировать, что
QGraphicsItem::prepareGeometryChange()
получает вызов раньше удаление предмета с места происшествия.
Проблема заключается в том, что во время удаления элемента из сцены внутренний индекс сцены не был должным образом обновлен, что привело к сбою при следующей попытке рисования сцены.
Поскольку в моем случае я использую пользовательский подкласс из
QGraphicsPathItem
, я просто помещаю вызовQGraphicsItem::prepareGeometryChange()
в его деструктор, так как я не удаляю вручную элемент из сцены (черезQGraphicsScene::removeItem()
), но вместо этого я просто вызываюdelete pItem;
, который в свою очередь запускает деструктор элемента, а такжеremoveItem()
позже.
У меня была эта проблема, и это была настоящая боль, чтобы исправить ее. Помимо аварии, у меня также были элементы" guost", появляющиеся на экране.
Я изменял размер boundingRect 2x внутри пользовательского метода updateGeometry (), который обновляет кэш boundingbox и shape элемента.
Я инициализировал прямоугольник boundig как QRectf ():
boundingBox = QRectF();
... затем выполнить некоторую обработку (и воспользоваться возможностью сделать некоторые очистки в ненужных объектах со сцены).
И, наконец, установка значения boundingRect на его новый размер:
boundingBox = polygon.boundingRect();
Вызов prepareGeometryChange () в самом начале не решил проблему, так как я дважды менял его размер.
Решение состояло в том, чтобы убрать первую атрибуцию.