我目前正在开发一个小型矢量绘图程序,您可以创建线条并在创建后修改它们(这些线条基于自定义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)
,但这很难看(并且很慢)。
答案 0 :(得分:1)
如果没有看到你如何更新这一行的完整功能,我猜你在更新项目的边界矩形之前已经省略了调用prepareGeometryChange()。
正如文档所述: -
准备项目以进行几何体更改。 在更改项目的边界矩形之前调用此函数以使QGraphicsScene的索引保持最新。