修改自定义QGraphicsItem时显示的工件

时间:2014-10-28 22:46:19

标签: qt repaint artifacts visual-artifacts

我目前正在开发一个小型矢量绘图程序,您可以创建线条并在创建后修改它们(这些线条基于自定义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 个答案:

答案 0 :(得分:1)

如果没有看到你如何更新这一行的完整功能,我猜你在更新项目的边界矩形之前已经省略了调用prepareGeometryChange()

正如文档所述: -

  

准备项目以进行几何体更改。 在更改项目的边界矩形之前调用此函数以使QGraphicsScene的索引保持最新。