手动在场景上绘制QPolygonF会在更新时导致渲染问题

时间:2015-02-11 17:12:53

标签: c++ qt

我有一个非常简单的代码,用于在Qt图表示例应用程序的启发下绘制图形顶点之间的箭头,但我有渲染工件的问题。当我使用以下代码

在场景上绘制三角形多边形时
QPolygonF arrowHead;
... some setup
painter->drawPolygon(arrowHead);

然后我移动三角形(arrowHead多边形)所指向的顶点,它会重新绘制,但旧的三角形仍然会在屏幕上呈现

render error

scene上的任何更新都会解决问题(在后台拖动或从其他地方调用update/invalidate)。

render ok

问题在于我不知道在何处强制更新,或者如何告诉Qt使被拖动的顶点周围的整个区域无效。

我已尝试从顶点上的scene()->invalidate()事件调用itemChange(也更新),因为它被拖动,但这会导致整个应用程序崩溃,所以我假设我不被允许从那里调用更新。我也无法直接从箭头的update方法调用paint,因为这会在自己的paint方法中无限递归。

我是否正确渲染,或者我是否需要以某种方式手动更新场景? Here's a link to the whole rendering source code,虽然我想我可能在绘画方面犯了一些基本错误。

2 个答案:

答案 0 :(得分:1)

您没有提供边缘项目的正确边界矩形。您从EdgeGraphicsItem派生QGraphicsLineItem,但未覆盖boundingRect。请确保您遵循文档,并且不要错过必要时调用prepareGeometryChange

答案 1 :(得分:0)

这就是诀窍:

添加

ui->graphicsView->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);

MainWindow的构造函数。

使用此标志将强制QGraphicsView更新整个视口。