天天看点

Qt弹出的对话框界面无法刷新(设置的样式不生效)

问题背景:

项目开发时需要实现:当服务启动时,弹出一个对话框用于提示当前服务在启动,当服务启动成功后对话框自动关闭。

问题现象:

对话框可以正常弹出,但弹出非模式对话框(即使用show函数)时,对话框的样式不生效,打开的是一个黑色对话框。使用模式对话框(即使用exec函数)时,可以正常显示样式。但这里需要使用非阻塞的对话框,对话框打开后程序需要继续运行,模式对话框不满足要求。

问题原因:

查了一些资料,发现由于我的服务启动有依赖关系,代码里在最后一个服务启动前主进场休眠了5秒钟,这就导致休眠时程序没有再处理事件响应,UI无法刷新。所以样式也没有显示出来。

解决方案:

解决思路就是在休眠的时候,继续处理程序的事件响应。主要两种方式:

1、使用QElapsedTimer延时5秒,延时过程中继续处理事件

#include <QElapsedTimer>
#include <QCoreApplication>
QElapsedTimer t;
t.start();
while(t.elapsed()<5000)
{
    QCoreApplication::processEvents();
}
           

2、 创建子事件循环,在子事件循环中,父事件循环仍然是可以执行的

QEventLoop loop;//定义一个新的事件循环
QTimer::singleShot(5000, &loop, SLOT(quit()));  //创建单次定时器
loop.exec();  //事件循环开始执行,程序会卡在这里,直到定时时间到,本循环被退出
           

我使用的方式2,亲测有效。方法1网上看到的,没测试过。

继续阅读