特别鸣谢,https://blog.csdn.net/lxj434368832/article/details/90171851
开始的想法很简单,在第一个版本中那个启动画面,那是一个静止的启动画面,在这个版本中,打算做一个可以动的,带有进度条的动画版的启动画面。本来想整个widget了,奈何自己道行太浅,实现不了,就只好作罢,在尝试带有进度条的版本的时候,发现用传统的动画方式,会将进度条遮住,使用静态图片就没有问题,如下图所示,但是弄成这样,就不是我想要的东西,所以就有了下面第二张图的样子了。
在第二张图中,进度条不是使用代码生成的,是在制作GIF图时就压制进去的。
这个实现,主要参考了文档头链接中的内容,甚至有的内容只是直接复制过来的;哈哈哈。
这里我把这个东西分装成了一个类“Loader”,这类其实是重在了QSplashScreen类。头文件如下
#ifndef LOADER_H #define LOADER_H #include <QObject> #include <QMovie> #include <QSplashScreen> class Loader : public QSplashScreen { Q_OBJECT public: Loader(const QPixmap & pixmap); Loader(const QString gifname); ~Loader(); protected: virtual void drawContents(QPainter *painter); void setGif(QString fileName); private slots: void slot_update(); private: QMovie *m_movie = NULL; int m_framecount; }; #endif // LOADER_H
源文件如下
#include "loader.h" #include <QPixmap> #include <QPainter> #include <QLabel> #include <QTimer> #include <QDebug> Loader::Loader(const QPixmap &pixmap):QSplashScreen(pixmap) { } Loader::Loader(const QString gifname) { setGif(gifname); QPixmap pixmap(gifname); this->setPixmap(pixmap); } Loader::~Loader() { } void Loader::setGif(QString fileName) { m_movie = new QMovie(fileName); m_framecount = m_movie->frameCount(); connect(m_movie,&QMovie::frameChanged,this,[=](int temp){ if(temp == (m_framecount-1)) { m_movie->stop(); } }); m_movie->start(); QTimer *timer = new QTimer(this); connect(timer,SIGNAL(timeout()),this,SLOT(slot_update())); timer->start(40); } void Loader::drawContents(QPainter *painter) { painter->setFont(QFont("黑体", 10)); painter->setPen(QColor(213, 218, 220)); painter->drawText(QPointF(5, 15), "Version: 1.0.0"); QSplashScreen::drawContents(painter); } void Loader::slot_update() { this->setPixmap(m_movie->currentPixmap()); repaint(); }
调用方式
int main(int argc,char *argv[]) { QApplication a(argc,argv); Loader *loader = new Loader(":/Core/Resources/Core/LoaderImage.gif"); loader->show(); QDateTime n=QDateTime::currentDateTime(); QDateTime now; do { now=QDateTime::currentDateTime(); a.processEvents(); }while (n.secsTo(now)<=4); ControlPanel controlPanel; controlPanel.show(); loader->finish(&controlPanel); delete loader; return a.exec(); }
附件:另一种实现方式:
#include "mainwindow.h" #include <QApplication> #include <QSplashScreen> #include <QPixmap> #include <QLabel> #include <QMovie> #include <QThread> int main(int argc, char *argv[]) { QApplication a(argc, argv); QPixmap pixmap("./images/login.gif"); QSplashScreen splash(pixmap); QMovie *movie = new QMovie("./images/login.gif"); QLabel *label = new QLabel(&splash); label->setMovie(movie); movie->start(); splash.show(); for(int i = 0;i<11000;i+=movie->speed()) { QCoreApplication::processEvents(); QThread::usleep(500*movie->speed()); } MainWindow w; w.show(); splash.finish(&w); return a.exec(); }