【问题标题】:Artifacts showing when modifying a custom QGraphicsItem修改自定义 QGraphicsItem 时显示的工件
【发布时间】: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-&gt;drawRect(boundingRect()) 表明了这一点:

简单地移动线(设置标志QGraphicsItem::ItemIsMovable)也没有问题,即使是快速移动。

有人知道这里发生了什么吗?我的猜测是update 没有被立即调用,因此mouseMoveEvent 可以在重绘发生之前多次调用,也许会取消以前的调用?我不确定。

当然,简单的解决方法是将持有线的QGraphicsView 对象的视口模式设置为QGraphicsView::FullViewportUpdate),但这很难看(而且很慢)。

【问题讨论】:

    标签: qt repaint artifacts visual-artifacts


    【解决方案1】:

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

    如文档所述:-

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多