QT程序启动前的预加载与QT程序的启动动画(C++)

一、目标任务

        在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则预加载程序失败
    }

}

上述代码由笔者在网页端编辑,如有错误请及时纠正,感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值