此前(1)解决的是在QGraphicsItem::boundingRect不变的情况下造成不绘制。这次解决的是QGraphicsItem::boundingRect随时都发生变化导致的不绘制。
这问题是我在不继承QGraphicsLineItem(调用setLine),而是继承QGraphicsItem时,绘制曲线导致的。通过调试,发现boundingRect并不是每次绘制都会调用,所以当我们改变了QGraphicsItem::boundingRect时,需要场景(scene)调用该item的boundingRect来获取到新的区域,以便判断该QGraphicsItem是不是在QGraphicsView的可视范围内,从而觉得需不需要调用QGraphicsItem::paint来绘制。

解决方式:在item改变boundingRect的地方调用prepareGeometryChange()。

由于我绘制的曲线item是根据两个QGraphicsItem的坐标去绘制的,所以我在重新计算曲线item有效范围(改变boundingRect)的函数末尾加了prepareGeometryChange()。

下图就是没加prepareGeometryChange的情况。当QGraphicsView放大时,部分曲线消失了,甚至一块有一块没。缩放回去又出现了。
正常情况:
在这里插入图片描述
放大部分曲线消失:
在这里插入图片描述
放大调整视图时,曲线不完整:
在这里插入图片描述

Logo

鸿蒙生态一站式服务平台。

更多推荐