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

调用update()未触发paintEvent()的原因排查

问题原因及解决办法

你的代码里有两个核心问题导致paintEvent()没被触发:

1. test_paint实例未被纳入显示体系

你创建了test_paint对象,但既没有把它添加到布局中,也没有调用show()方法。Qt只会给可见且处于显示树中的Widget触发paintEvent,这个test_paint对象本质上是个“隐形”的Widget,调用update()自然不会有任何反应。

2. 绘图逻辑错误

你在paintEvent里把QPainter绑定到了传入的paper(也就是中心Widget),但test_paint本身是独立的QWidget子类,应该绘制自身的区域,而不是父控件的区域。


修正代码步骤:

第一步:修改main.cpp,将test_paint加入布局

在创建test_paint对象后,把它添加到中心Widget的布局里:

test_paint* d = new test_paint(center);
vlayout->addWidget(d); // 新增:把d加入布局,让它显示出来

第二步:修改test_paint.h中的paintEvent逻辑

把绘图目标改为当前Widget自身,同时可以调整坐标让直线居中:

void paintEvent(QPaintEvent* e){
    QPainter p(this); // 绘制当前Widget自己的区域
    QPen myPen;
    myPen.setColor(Qt::red);
    myPen.setWidth(5);
    p.setPen(myPen);
    // 计算中心坐标,绘制居中的直线
    int centerX = width() / 2;
    int centerY = height() / 2;
    QPoint p1(centerX - 45, centerY);
    QPoint p2(centerX + 45, centerY);
    p.drawLine(p1,p2);
};

这样修改后,点击按钮调用update()时,test_paint的paintEvent就会被正常触发,你也能看到居中的红色直线了。

内容的提问来源于stack exchange,提问作者rainbowfart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 11:52:39