3

我目前正在开发一个小型矢量绘图程序,您可以在其中创建线条并在创建后对其进行修改(这些线条基于自定义 QGraphicsItem)。例如,下图显示了当线条的最左侧(标记为黄色)点被拖动到屏幕右侧时会发生什么,有效地延长了线条:

图1

缓慢移动该点时一切正常,但是,当快速移动时,会出现一些视觉伪影:

在此处输入图像描述

我用来调用重绘的代码位于mouseMoveEventredefined 方法中,该方法包含以下代码行:

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),但这很难看(而且很慢)。

4

1 回答 1

2

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

正如文档所述: -

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

于 2014-10-29T09:16:37.770 回答