QT程序启动画面问题

时间:2022-04-16 05:22:14

程序启动时比较枯燥,同时为了增加程序趣味,考虑做一个启动画面。

在Qt中实现启动界面,主要就是使用QSplashScreen类。关于QSplashScreen类的使用问题,主要参考

http://blog.csdn.net/chenlong12580/article/details/23713025

http://blog.csdn.net/andy_93/article/details/52700697

然而此博客仅仅介绍了如何封装QSplashScreen类,并为介绍怎么使用,而我仅仅是一个QT新手,在使用过程中遇到一些问题,特此记录

首先是头文件SplashScreenMng.h的封装,实现如下

 1 #ifndef SPLASHSCREENMNG_H  
 2 #define SPLASHSCREENMNG_H  
 3   
 4 class QMutex;  
 5 class QSplashScreen;  
 6 class QString;  
 7   
 8 class CSplashScreenMng  
 9 {  
10 public:  
11     /** 
12      * 函数功能:获取CSplashScreenMng的唯一对象指针 
13      * 返回值: CSplashScreenMng对象指针 
14      */  
15     static CSplashScreenMng* getInstance();  
16       
17     /** 
18      * 函数功能:获取QSplashScreen指针对象并显示 
19      * 参数:  fileName [in] QSplashScreen显示的图片文件 
20      * 返回值:QSplashScreen对象指针 
21      */  
22     QSplashScreen* showSplash(const QString &fileName);  
23       
24     /** 
25      *  函数功能:设置QSplashScreen对象的内容 
26      *  参数: text [in] 需要显示的内容 
27      */  
28     void setSplashStatus(const QString &text);  
29       
30     //销毁QSplashScreen对象  
31     void destroySplash();  
32 private:  
33     CSplashScreenMng();  //构造函数  
34     ~CSplashScreenMng(); //析构函数  
35     CSplashScreenMng(const CSplashScreenMng &other); //拷贝构造  
36     CSplashScreenMng& operator=(const CSplashScreenMng &other); //赋值运算操作符  
37       
38 private:  
39     QSplashScreen*  m_pSplash;   
40     static QMutex mutex;  
41     static CSplashScreenMng* m_pSplashScreenMng; // CSplashScreenMng 全局唯一的变量  
42 };  
43   
44 #endif //SPLASHSCREENMNG_H  

其次是关于实现文件SplashScreenMng.cpp

 1 #include "SplashScreenMng.h"  
 2 #include <QMutex>  
 3 #include <QObject>  
 4 #include <QPixmap>  
 5 #include <QSplashScreen>  
 6 #include <QString>  
 7   
 8 QMutex CSplashScreenMng::mutex;  
 9 CSplashScreenMng* CSplashScreenMng::m_pSplashScreenMng = NULL;  
10   
11 CSplashScreenMng::CSplashScreenMng()  
12 {  
13     m_pSplash = NULL;  
14 }  
15   
16 CSplashScreenMng::~CSplashScreenMng()  
17 {  
18   
19 }  
20   
21 CSplashScreenMng* CSplashScreenMng::getInstance()  
22 {  
23     if(NULL == m_pSplashScreenMng){  
24         mutex.lock();  
25         if(NULL == m_pSplashScreenMng){  
26             m_pSplashScreenMng = new CSplashScreenMng();  
27         }  
28         mutex.unlock();  
29     }  
30     return m_pSplashScreenMng;  
31 }  
32       
33 QSplashScreen*  CSplashScreenMng::showSplash(const QString &fileName)  
34 {  
35     QPixmap pixmap(fileName);  
36     if(pixmap.isNull())  
37         return NULL;  
38   
39     m_pSplash = new QSplashScreen(pixmap);  
40     m_pSplash->show();  
41     setSplashStatus(QObject::tr("初始化..."));  
42       
43     return  m_pSplash;  
44 }  
45       
46 void CSplashScreenMng::setSplashStatus(const QString &text)  
47 {  
48     if(!m_pSplash)  
49         return ;  
50   
51     QString splashText = text;  
52     splashText += QObject::tr("请稍后...");  
53     m_pSplash->showMessage(splashText, Qt::AlignLeft | Qt::AlignBottom, Qt::white);//这里设置为左下角显示信息  
54 }  
55   
56 void CSplashScreenMng::destroySplash()  
57 {  
58     if(m_pSplash){  
59         delete m_pSplash;  
60         m_pSplash = NULL;  
61     }  
62 }  

文件封装结束需要调用,在调用过程中,资源文件的配置上图片格式无强制要求。但是在使用中仅仅放到工程目录Resources下程序仍然无法识别。后来尝试发现,是没有放入资源文件中。QT的资源文件是*.qrc,但是资源文件在VS2013环境下无法直接打开。这时可以通过打开Form Files下的*.ui,然后在QtDesigner下编辑*.qrc,增加图片文件,然后调用即可。

调用时的代码如下

 1 #include <windowsx.h>
 2 #include<QSplashScreen>
 3 #include<QtTest/qtest.h>
 4 int main(int argc, char *argv[])
 5 {
 6     QApplication a(argc, argv);
 7     
 8     QSplashScreen* splash =CSplashScreenMng::getInstance()->showSplash(":/TunnelView/Resources/Initialize3.jpg");  
9
//CSplashStart::getInstance()->setSplashStatus("Welcome");

10   QTest::qSleep(1000);//延时

11   a.processEvents();
12   TunnelView w;
13   w.show();
14   splash->finish(&w);
15   CSplashScreenMng::getInstance()->DestroySplash();
16   return a.exec();
17 }

在选择图片目录时图片目录要包含至工程Resources上一层目录,否则图片无法加载。此时采用在QtDesigner中的资源管理中复制目录最方便,避免出错。