一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

  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 }

 

posted on 2024-05-21 16:26  一杯清酒邀明月  阅读(793)  评论(0编辑  收藏  举报