QGraphicsPolygonItem如何更新顶点坐标?QT图形刷新问题求助
QGraphicsPolygonItem更新顶点后场景不刷新的解决方法
我接触QT仅一周,对图形管理尚不熟悉。使用QGraphicsPolygonItem创建了代表四个压力值的多边形,尝试通过以下代码更新顶点坐标后,场景中的多边形并未刷新:
double deltaPos_A = vshp->cpu_v.paramCpuToVisu.liftData[0].pos - vshp->cpu_v.paramCpuToVisu.lift.hMin; double deltaPos_B = vshp->cpu_v.paramCpuToVisu.liftData[1].pos - vshp->cpu_v.paramCpuToVisu.lift.hMin; double deltaPos_C = vshp->cpu_v.paramCpuToVisu.liftData[2].pos - vshp->cpu_v.paramCpuToVisu.lift.hMin; double deltaPos_D = vshp->cpu_v.paramCpuToVisu.liftData[3].pos - vshp->cpu_v.paramCpuToVisu.lift.hMin; double kPos_X = 180 / (vshp->cpu_v.paramCpuToVisu.lift.hMax - vshp->cpu_v.paramCpuToVisu.lift.hMin); double kPos_Y = 295 / (vshp->cpu_v.paramCpuToVisu.lift.hMax - vshp->cpu_v.paramCpuToVisu.lift.hMin); graphic_Press->polygon()[0].setX(-deltaPos_A*kPos_X); graphic_Press->polygon()[0].setY(-deltaPos_A*kPos_Y); graphic_Press->polygon()[1].setX(deltaPos_B*kPos_X); graphic_Press->polygon()[1].setY(-deltaPos_B*kPos_Y); graphic_Press->polygon()[2].setX(deltaPos_C*kPos_X); graphic_Press->polygon()[2].setY(deltaPos_C*kPos_Y); graphic_Press->polygon()[3].setX(-deltaPos_D*kPos_X); graphic_Press->polygon()[3].setY(deltaPos_D*kPos_Y); graphic_Press->polygon()[4].setX(-deltaPos_A*kPos_X); graphic_Press->polygon()[4].setY(-deltaPos_A*kPos_Y);
相关声明代码如下(graphic_Press_Polygon是包含5个点的QPolygonF):
QGraphicsPolygonItem* graphic_Press; graphic_Press = mSceneMSPE->addPolygon(graphic_Press_Polygon,greenPen,trasparentBrush);
问题根源
QGraphicsPolygonItem::polygon()默认返回的是内部多边形的副本,你修改的只是这个临时副本的顶点,并没有改变item实际存储的多边形数据,因此场景不会触发重绘。
修复方案
先获取多边形副本,修改完成后通过setPolygon()将更新后的多边形重新赋值给item,必要时可显式调用update()确保刷新:
// 先获取多边形副本 QPolygonF updatedPolygon = graphic_Press->polygon(); double deltaPos_A = vshp->cpu_v.paramCpuToVisu.liftData[0].pos - vshp->cpu_v.paramCpuToVisu.lift.hMin; double deltaPos_B = vshp->cpu_v.paramCpuToVisu.liftData[1].pos - vshp->cpu_v.paramCpuToVisu.lift.hMin; double deltaPos_C = vshp->cpu_v.paramCpuToVisu.liftData[2].pos - vshp->cpu_v.paramCpuToVisu.lift.hMin; double deltaPos_D = vshp->cpu_v.paramCpuToVisu.liftData[3].pos - vshp->cpu_v.paramCpuToVisu.lift.hMin; double kPos_X = 180 / (vshp->cpu_v.paramCpuToVisu.lift.hMax - vshp->cpu_v.paramCpuToVisu.lift.hMin); double kPos_Y = 295 / (vshp->cpu_v.paramCpuToVisu.lift.hMax - vshp->cpu_v.paramCpuToVisu.lift.hMin); updatedPolygon[0].setX(-deltaPos_A*kPos_X); updatedPolygon[0].setY(-deltaPos_A*kPos_Y); updatedPolygon[1].setX(deltaPos_B*kPos_X); updatedPolygon[1].setY(-deltaPos_B*kPos_Y); updatedPolygon[2].setX(deltaPos_C*kPos_X); updatedPolygon[2].setY(deltaPos_C*kPos_Y); updatedPolygon[3].setX(-deltaPos_D*kPos_X); updatedPolygon[3].setY(deltaPos_D*kPos_Y); updatedPolygon[4].setX(-deltaPos_A*kPos_X); updatedPolygon[4].setY(-deltaPos_A*kPos_Y); // 将修改后的多边形设置回item,自动触发重绘 graphic_Press->setPolygon(updatedPolygon); // 显式调用update确保刷新(可选,setPolygon通常已触发) graphic_Press->update();
额外提示
- QT中很多图形项的属性获取方法返回的都是副本,修改副本无法影响原对象,必须通过对应的
setXXX()方法更新内部状态。 - 若后续需要频繁更新顶点,建议直接维护一个独立的
QPolygonF对象,修改后再调用setPolygon(),这样代码更高效简洁。
内容的提问来源于stack exchange,提问作者Pierluigi Rovere
相关产品推荐
相关产品推荐

