【发布时间】:2014-12-24 12:53:17
【问题描述】:
我目前正在开发一个小型矢量绘图程序,您可以在其中创建线条并在创建后对其进行修改(这些线条基于自定义 QGraphicsItem)。例如,下图显示了当线条的最左边(标记为黄色)点被拖动到屏幕右侧时会发生什么,有效地延长线条:
当点缓慢移动时一切正常,但是,当快速移动时,会出现一些视觉伪影:
我用来调用重绘的代码位于mouseMoveEvent redefined 方法中,该方法包含以下代码行:
QRectF br = boundingRect();
x2 = static_cast<int>(event->scenePos().x()-x());
y2 = static_cast<int>(event->scenePos().y()-y());
update(br);
我的boundingRect 定义显然没有问题,因为在paint 方法中添加painter->drawRect(boundingRect()) 表明了这一点:
简单地移动线(设置标志QGraphicsItem::ItemIsMovable)也没有问题,即使是快速移动。
有人知道这里发生了什么吗?我的猜测是update 没有被立即调用,因此mouseMoveEvent 可以在重绘发生之前多次调用,也许会取消以前的调用?我不确定。
当然,简单的解决方法是将持有线的QGraphicsView 对象的视口模式设置为QGraphicsView::FullViewportUpdate),但这很难看(而且很慢)。
【问题讨论】:
标签: qt repaint artifacts visual-artifacts