Сбой после 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 () в самом начале не решил проблему, так как я дважды менял его размер.
Решение состояло в том, чтобы убрать первую атрибуцию.