HMI-2-[QSplashScreen]:启动动画

举报
DreamLife 发表于 2022/04/14 23:15:34 2022/04/14
【摘要】 基于Qt的汽车仪表模拟 特别鸣谢,Qt QSplashScreen显示动画(gif效果)和消息_lxj434368832的博客-CSDN博客_qsplashscreen 开始的想法很简单,在第一个版本中那个启动画面,那是一个静止的启动画面,在这个版本中,打算做一个可以动的,带有进度条的动画版的启动画面。本来想整个widge...

基于Qt的汽车仪表模拟

特别鸣谢,Qt QSplashScreen显示动画(gif效果)和消息_lxj434368832的博客-CSDN博客_qsplashscreen

开始的想法很简单,在第一个版本中那个启动画面,那是一个静止的启动画面,在这个版本中,打算做一个可以动的,带有进度条的动画版的启动画面。本来想整个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();
}

2019/08/12 23:55

说明:

本项目中所使借鉴原型来自:[吉利] 博瑞GE | 仪表HMI设计吉利汽车HMI项目

设计图的所有权和解释权都归吉利汽车所有。

本项目所有资源文件均有打不死的小海复刻制作。

本项目代码暂时不会开源,有需要的源码的可与我联系,左上角二维码加微信。

本项目仅限学习交流、禁止商业使用。

文章来源: dreamlife.blog.csdn.net,作者:DreamLife.,版权归原作者所有,如需转载,请联系作者。

原文链接:dreamlife.blog.csdn.net/article/details/99571788

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。