Сбой после QGraphicsScene:: removeItem () с пользовательским классом элементов


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

delete pItem;

Это автоматически вызывает QGraphicsScene::removeItem(), однако это также приводит к сбою в классе QGraphicsSceneFindItemBspTreeVisitor во время следующей перерисовки.

2 2

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

Решение состояло в том, чтобы убрать первую атрибуцию.