Qt实现程序启动动画

演示一个应用程序启动时,添加启动动画的小例子。

所谓启动动画,就是说当一个应用程序启动时,在展示主窗口之前,有可能会先去初始化一些运行环境,验证用户信息等前提工作。那么在这段空闲期程序的启动过程是没有用户界面的,而用户也无法得知程序的状态,所以就需要在这段空白时间中,向用户提供一个展示程序运行状态的窗口,来为用户提供积极的正反馈。

启动动画在很多软件中得到了应用,例如游戏加载画面,VS的启动画面等。

当然,强大的Qt也为我们提供了启动动画的相关接口,即QSplashScreen,下面代码是实现启动动画的一个简单例子:

main.cpp

#include 
#include 
int main(int argc, char *argv[]){
    QApplication a(argc, argv);
    //创建启动动画类实例,使用资源文件splash.jpg作为展示图片    
	QSplashScreen splash(QPixmap(":/splash.jpg"));
    splash.show();
    QWidget w;
    w.show();
    splash.finish(&w);
    return a.exec();
}

然后运行程序,出现启动动画效果,然后出现主窗口。

但此时动画一闪而过,那是因为程序什么都没有做,为此再模拟一个读取数据库数据的代码,以加长启动时间。

main.cpp

#include 
#include 
class DataBase{
public:
    void readData()    {
		for (int i = 0; i < 100000; ++i)        
		{            
			qDebug("reading data");
		}    
	}
};
int main(int argc, char *argv[]){    QApplication a(argc, argv);
    QSplashScreen splash(QPixmap(":/splash.jpg"));
    splash.show();
    DataBase db;
    db.readData();
    QWidget w;
    w.show();
    splash.finish(&w);
    return a.exec();
}

在正常情况下,仅仅提供一张图片对用户其实是不友善的,所以我们还可以添加一个进度条来标识应用程序的启动状态。添加一个SplashScreen类

splashscreen.h

#ifndef  SPLASHSCREEN_H 
#define  SPLASHSCREEN_H  
#include   < QSplashScreen > 
#include   < QProgressBar >  

namespace   Ui   {
 class   SplashScreen ;
 }  
 
class   SplashScreen   :   public   QSplashScreen {
	Q_OBJECT  
  public :
      explicit   SplashScreen ( QPixmap  pixmap ,   QWidget   * parent  =   0 );
      ~ SplashScreen ();
       //设置进度区间      
       void  setRange ( int  min ,   int  max );
  public  slots :
	  //更新进度      
	  void  updateProgress ( int  num );
      void  showProgressMessage ( int  total ,   const   QString &  msg );
  private :
	  Ui :: SplashScreen   * ui ;
      QProgressBar   * bar ;  //进度条 
};
  #endif   // SPLASHSCREEN_H

splashscreen.cpp

#include 
#include "splashscreen.h"
#include "ui_splashscreen.h"

SplashScreen::SplashScreen(QPixmap pixmap, QWidget *parent) :
    QSplashScreen(parent, pixmap),
    ui(new Ui::SplashScreen)
{

    ui->setupUi(this);
    bar = new QProgressBar(this);
    //设置进度条的位置    
	bar->setGeometry(0,pixmap.height()-50,pixmap.width(),30);
    resize(pixmap.size());
}

SplashScreen::~SplashScreen(){
    delete ui;
}

void SplashScreen::setRange(int min, int max){
    bar->setRange(min, max);
}

void SplashScreen::updateProgress(int num){
    bar->setValue(num);
}

void SplashScreen::showProgressMessage(int total, const QString &msg){
    bar->setRange(0, total);
    showMessage(msg);
}

database.h

#ifndef  DATABASE_H 
#define  DATABASE_H  
#include   < QObject > 
#include   < QColor >  
class   DataBase   :   public   QObject {
     Q_OBJECT 
public :
	 explicit   DataBase ( QObject   * parent  =   0 );
      void  readData ();
signals :
      void  readingData ( int  num );
      void  startReadData ( int  total ,   const   QString &  msg );
 };
  
#endif   // DATABASE_H

database.cpp

#include "database.h"
DataBase::DataBase(QObject *parent) : QObject(parent){
}

void DataBase::readData(){
    int max = 10000;
    emit startReadData(max, "is reading data");
    for (int i = 0; i < max; ++i)    {
        emit this->readingData(i);
        qDebug("reading data");
    }
}

main.cpp

#include 
#include "splashscreen.h"
#include "database.h"
int main(int argc, char *argv[]){
    QApplication a(argc, argv);
    SplashScreen splash(QPixmap(":/splash.jpg"));
    splash.show();
    a.processEvents();
    DataBase db;
    QObject::connect(&db, SIGNAL(startReadData(int, QString)),
					&splash, SLOT(showProgressMessage(int,QString))
					);
    QObject::connect(&db, SIGNAL(readingData(int)),
					&splash, SLOT(updateProgress(int))
					);
    db.readData();
    QWidget w;
    w.show();
    splash.finish(&w);
    return a.exec();
}

运行效果:

下载链接

你可能感兴趣的:(QT)