程序启动时比较枯燥,同时为了增加程序趣味,考虑做一个启动画面。
在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中的资源管理中复制目录最方便,避免出错。