You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 12:25:22