调用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
相关产品推荐
相关产品推荐

