QGraphicsItem не выбирает проблему перерисовки

Очень простое приложение Qt GUI:

  • На сцене у меня есть несколько кругов, реализованных как QGraphicsItem.
  • boundingRect возвращает квадрат вокруг этого круга.
  • Метод shape не переопределяется.

Проблема возникает, когда в методе paint() я добавил:

if (isSelected()) {
    painter->drawRect(re);
}

Выделение рисуется хорошо, но снятие выделения не приводит к перерисовке. На уровне журнала я вижу, что элемент действительно потерял флаг выбора. Вызов update() из itemChange также бесполезен. Заранее благодарим вас за любое предложение.


person Dewfy    schedule 19.10.2009    source источник


Ответы (2)


Через 10 дней я вернулся к этой проблеме и обнаружил, что мой QGraphicsItem создан с помощью setCacheMode(DeviceCoordinateCache); OMG! Глупая ошибка, при удалении этой строки (по умолчанию используется QGraphicsItem::NoCache) выделение хорошо перерисовывается.

person Dewfy    schedule 29.10.2009
comment
Можете ли вы объяснить мне, почему этот флаг setCacheMode создает проблему ... прямо сейчас я столкнулся с той же проблемой. если я установлю QGraphicsProxyWidget с этим флагом, он не будет правильно отображать метку, пока я не установлю окно просмотра в opengl. - person Wagmare; 30.09.2013
comment
@Wagmare это довольно просто - потому что рамка вокруг элемента не отображается в кеше. Кэш уровня DeviceCoordinateCache слишком хорош, поэтому в нем не отображаются изменения границы. - person Dewfy; 30.09.2013
comment
спасибо за очень полезный ответ .. так как я могу использовать кеш в QGraphicsProxyWidget, так как мне нужно добавить более тысячи элементов, необходимых для использования кеша? - person Wagmare; 01.10.2013
comment
границы видны, но не видно только растровое изображение..иногда частично видно в некоторых областях.. - person Wagmare; 01.10.2013
comment
@Wagmare пытается изменить уровень CacheMode (см. qt- project.org/doc/qt-5.0/qtwidgets/) или полностью удалить setCacheMode - person Dewfy; 01.10.2013

Вы также можете попробовать изменить QGraphicsView::MinimalViewportUpdate по умолчанию на FullViewportUpdate с помощью setViewportUpdateMode(QGraphicsView::FullViewportUpdate);

Или вы можете вызвать scene()->update(); от предмета, чтобы запланировать перекраску.

Один из них потребовался, по крайней мере, когда я продолжал менять флаг QGraphicsItem::ItemHasNoContents для элемента.

person kleimola    schedule 10.06.2010