一、目标任务
在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则预加载程序失败}}
上述代码由笔者在网页端编辑,如有错误请及时纠正,感谢。