一、目标任务
在Qt的程序启动前需要做一些预加载操作,这个过程可能持续十几秒,这会让QT程序卡住,所以希望在此期间显示启动动画;
二、具体实现
1、预加载内容的处理
此处需要将预先加载的程序内容放在单独一个线程中(使用detach()执行),通过全局变量作为信号来获取加载完成进度,示例如下:
//以下内容建议新建一个项目实现,然后在原先的QT项目中调用该项目的函数
//补充自己需要的头文件及其它内容
#include <thread>
int run_flag = 99;//全局变量,用于传输信号
//需要加载的程序代码Load_Progarm()
void Load_Program()
{
//输入你的程序
//程序运行结束改变信号
if(true)
{
run_flag = 1;
}
else
{
run_flag = 0;
}
}
void Start_Program()
{
//创建一个线程运行上述程序
std::thread Start_Thread(Load_Program);
//使用detach启动线程
Start_Thread.detach();
}
//获取信号
int get_RunFlag()
{
return run_flag;
}
2、在QT程序启动前开启动画并判断预加载程序是否完成
在QT项目的main函数里实现:
#include <QApplication>
#include <QMessageBox>
#include <QSplashScreen>
#include <QPixmap>
//补充其它用到的头文件、例如预加载程序的调用头文件
int main(int argc, char *argv[])
{
QApplication a(argc,argv);
int res = 99;//用于判断预先加载程序的返回值
//开场动画
QSplashScreen* splash = new QSplashScreen;
QPixmap pixmap("FileImg.png");//动画图片所在路径
splash->setPixmap(pixmap);
//设置样式,将背景设置为透明(前提是使用.gif或者.png图像)
splash->setStyleSheet("backgroud-color: transparent;");
//使用QSplashScreen创建的动画显示时,默认鼠标点击会消失,此处禁用交互
splash->setDisabled(true);
//显示
splash->show();
//设置该动画窗口置顶于所有窗口的最上层显示
::SetWindowPos(HWND(splash->winId()),HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE| SWP_SHOWWINDOW);
//执行预先加载程序
Start_Program();//该函数参考上述预加载程序示例
//通过返回信号判断预加载程序是否结束
while(1)
{
QCoreApplication::processEvents();//释放事件,防止卡死
Sleep(1);//如果是动态图,则此处为每一帧的间隔
res = get_RunFlag();//该函数参考上述预加载程序示例,用于返回当前状态
if(res != 99)
{
break;
}
}
//取消动画窗口置顶
::SetWindowPos(HWND(splash->winId()),HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE| SWP_SHOWWINDOW);
//判断预加载程序返回内容
if(res==1)
{
//加载成功,启动QT程序
Your_Project w;
w.show();
//启动前关闭动画
splash->finish(&w);
return a.exec();
}
else
{
//返回0则预加载程序失败
}
}
上述代码由笔者在网页端编辑,如有错误请及时纠正,感谢。