2014-10-28 4 views
2

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

Figure1

Все отлично работает, когда речь идет двигался медленно, однако при быстром перемещении, появляются некоторые визуальные артефакты:

enter image description here

кусок кода я использую для вызова для перекрашивать расположен в mouseMoveEvent переопределяется метод, который содержит следующие строки код:

QRectF br = boundingRect(); 
x2 = static_cast<int>(event->scenePos().x()-x()); 
y2 = static_cast<int>(event->scenePos().y()-y()); 
update(br); 

Там нет, видимо, никаких проблем с моим boundingRect определению, так как добавление painter->drawRect(boundingRect()) в методе paint показывает это:

enter image description here

И нет также никаких проблем, когда линия просто перемещается (флаг QGraphicsItem::ItemIsMovable устанавливается), даже быстро.

Кто-нибудь знает, что здесь происходит? Я предполагаю, что update не вызывается немедленно, поэтому mouseMoveEvent можно вызвать несколько раз, прежде чем произойдет перекраска, возможно, отменит предыдущие вызовы? Я не уверен.

Конечно, легко установить режим просмотра объекта QGraphicsView, удерживая линию до QGraphicsView::FullViewportUpdate), но это уродливо (и медленно).

ответ

1

Не видя полной функции, как вы обновляете линию, я бы предположил, что вы не указали prepareGeometryChange() перед обновлением ограничивающего прямоугольника элементов.

В состоянии Документов: -

Подготавливает элемент для изменения геометрии. Вызовите эту функцию перед изменением ограничивающего прямоугольника элемента, чтобы обновить индекс QGraphicsScene.

+1

Это решило проблему, спасибо! – thomasc

 Смежные вопросы

  • Нет связанных вопросов^_^