В настоящее время я разрабатываю небольшую программу рисования векторов, в которой вы можете создавать строки и изменять их после создания (эти строки основаны на пользовательском QGraphicsItem). Например, на рисунке ниже показано, что происходит, когда крайний левый (отмечен желтым цветом) точка линии перетаскивается в правой части экрана, эффективно удлиняя линию:Артефакты, показывающие при изменении пользовательского QGraphicsItem
Все отлично работает, когда речь идет двигался медленно, однако при быстром перемещении, появляются некоторые визуальные артефакты:
кусок кода я использую для вызова для перекрашивать расположен в 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
показывает это:
И нет также никаких проблем, когда линия просто перемещается (флаг QGraphicsItem::ItemIsMovable
устанавливается), даже быстро.
Кто-нибудь знает, что здесь происходит? Я предполагаю, что update
не вызывается немедленно, поэтому mouseMoveEvent
можно вызвать несколько раз, прежде чем произойдет перекраска, возможно, отменит предыдущие вызовы? Я не уверен.
Конечно, легко установить режим просмотра объекта QGraphicsView
, удерживая линию до QGraphicsView::FullViewportUpdate)
, но это уродливо (и медленно).
Это решило проблему, спасибо! – thomasc