Qt 6.11 is out! See what's new in the release
blog
QWidget程序在paintEvent中绘制背景色的问题
-
环境
Win10,Qt5.14.2+MSVC,VS2022;
问题描述
基于QWidget的工程,调用QWidget::show之后,开始事件循环之前,主窗口显示出来了,但其上的子控件并未显示,且paintEvent也未被调用。直到事件循环开始后,子控件才会显示,paintEvent也才会被调用。这会导致程序启动时会闪一下。特别是如果在paintEvent里刷深色背景的话特别明显。
请问如何才能解决这个问题?
重现步骤
- VS中基于QWidget建立一个新的工程wDemo;
- 用QtDesigner在主窗口上加入一个pushbutton;
- 在wDemo.h中添加以下函数申明:
void paintEvent(QPaintEvent* event);- 在wDemo.cpp添加函数实现:
void wDemo::paintEvent(QPaintEvent* event){ QPainter painter(this); pn.fillRect(QRect(0, 0, width(), height()), Qt::blue); }- 编译执行。可以看到程序启动的时候会先闪一下。
- 为仔细观察,可在main.cpp的return a.exec()那一行加个断点观察。
//main.cpp int main(int argc, char* argv[]){ QApplication a(argc, argv); wDemo w; w.show(); //w.show()之后,主窗口显示,但pushbutton未显示,且w.paintEvent并未调用,主窗口背景为原始白色。 return a.exec(); //断点加在此行。此行执行后,子控件才会显示,w.paintEvent也会被调用,背景被刷成蓝色 }备注
实测:
- QWidget换成QDiaolog,QWindow为BaseClass的工程也这样。
- MSVC换MinGW也如此。
- VS换成QtCreator也是这样。