QSplashScreen是Qt框架提供的一个类,用于在应用程序启动时显示一个带有文本和图像的启动画面(Splash Screen)。
使用QSplashScreen类,你可以在应用程序启动时显示一个自定义的启动画面,以提供更好的用户体验。这个类提供了一些方法和属性,可以让你设置启动画面的文本、图像和其他样式。
启动画面有两种,一种是静态启动画面,即运行程序显示一个界面(一张图片),显示结束后关闭程序界面。另一种是动态画面,即运行程序显示一个动态画面,通常是一段视频、或一个gif格式图片,播放结束后运行程序。
QSplashScreen类构造函数默认传入QPixMap类型的参数,因此,静态启动和动态启动所需要的画面都需要借助QPixMap类。下图是QSplashScreen类的构造函数详情:
1.静态启动画面
首先用QPixMap加载图像,然后传入QPixMap作为参数创建一个QSplashScreen类,调用show()显示。在show()之后调用QApplication::processEvents()。关于processEvents事件循环,文档解释是:预先调用处于队列状态的事件,直到全部处理完毕。通俗来说就是,在启动画面没显示完成之前,不要执行后面的界面ui绘制。最后,在主程序显示之后,调用dinish()结束启动画面。
1 #include "toolbox.h"
2 #include <QApplication>
3
4 int main(int argc, char *argv[])
5 {
6 QApplication a(argc, argv);
7 //===静态程序启动画面===
8 QPixmap pix(":/resource/splash1.png");
9 QSplashScreen splash(pix);
10 splash.show();
11 a.processEvents();
12
13 toolbox w;
14 w.show();
15
16 splash.finish(&w);//程序启动画面结束
17
18 return a.exec();
19 }
2.动态启动画面
由于QSplashScreen默认使用QPixmap类型的数据作为参数,所以直接调用gif文件或视频文件是无效的。这里需要使用QMovie实现动态画面的播放。
首先还是要定义QPixmap和QSplashScreen,然后通过一个事件循环,让gif以指定速度刷新,然后将刷新的帧画面以pixmap的方式显示。这里要注意的就是gif的播放速度要与事件循环速度匹配。
1 #include "toolbox.h"
2 #include <QApplication>
3
4 int main(int argc, char *argv[])
5 {
6 QApplication a(argc, argv);
7
8 //===动态程序启动画面===
9 QPixmap pix(":/resource/splash2.gif");//这行代码加载了一个本地的GIF图片资源,它被用作Splash的背景
10 QSplashScreen splash(pix);//使用QPixMap创建了一个QSplashScreen对象,这个对象通常用于显示一个临时的Splash窗口,通常在程序启动或进行某些耗时操作时显示
11 QLabel splashlabel(&splash);//创建一个QLabel对象,他的父窗口是之前创建的QSplashScreen对象,这个标签将显示在Splash窗口上
12 QMovie splashgif(":/resource/splash2.gif");//加载本地GIF动画资源
13 splashlabel.setMovie(&splashgif);//将QLabel的movie设置为刚刚加载的GIF动画
14 splashgif.start();//开始播放GIF
15 splash.show();//显示Splash
16 splash.setCursor(Qt::BlankCursor);//设置Splash窗口的鼠标光标样式为空白,也就是不显示鼠标外观
17 for(int i=0;i<15000;i+=splashgif.speed()){//循环,使得程序等待Splash动画播放完毕
18 QCoreApplication::processEvents();//循环每一次都调用QCoreApplication::processEvents()来处理Qt的事件队列
19 Sleep(splashgif.speed()/5);//然后暂停一段时间
20 } //循环持续到动画播放结束
21
22 toolbox w;
23 w.show();
24
25 splash.finish(&w);//程序启动画面结束
26
27 return a.exec();
28 }