Qt程序启动动画

发布于:2025-06-18 ⋅ 阅读:(15) ⋅ 点赞:(0)

一、Qt有3种方式实现程序启动动画(介绍)

1、QSplashScreen 静态图片(png、jpg等格式)

2、QMovie 动态图片(gif格式)

3、QAxWidget 视频(swf格式)

1.QSplashScreen 静态图片(png、jpg等格式)

//创建启动动画类实例
QSplashScreen splash(QPixmap("C:/Users/10600/Pictures/imgs/p1.png")); //文件绝对路径 也可以使用相对路径
splash.showMessage(QStringLiteral("正在初始化..."));//消息提示
splash.show(); //显示

a.processEvents(); //保证先完成启动画面的绘制显示,再执行后面的w显示

//主界面显示
MainWindow w;
w.show();

splash.finish(&w); //结束

2.QMovie 动态图片(gif格式)

QMovie movie("C:/Users/10600/Pictures/tai.gif");
QLabel label;

label.setGeometry(300, 300, 500, 500);
label.setMovie(&movie);
label.setScaledContents(true); //自动适应窗口大小
label.setWindowFlags(Qt::FramelessWindowHint); //去除边框

movie.start();
label.show();

//延迟5秒
QTime t;
t.start();
while(t.elapsed() < 5000)
{
QApplication::processEvents();
}

//主界面显示
MainWindow w;
w.show();
label.close();

3.QAxWidget视频(swf格式)

需要在.pro文件中添加 QT += axcontainer

QTextCodec *codec = QTextCodec::codecForName("GB2312"); //文本为GB2312编码
QTextCodec::setCodecForLocale(codec); //设置本地编码

QAxWidget flash;
flash.resize(800,600); //设置该控件的初始大小
flash.setControl(QString::fromUtf8("{d27cdb6e-ae6d-11cf-96b8-444553540000}")); //设定控制器
flash.dynamicCall("LoadMovie(long,string)", 0, "C:/Users/10600/Videos/2.swf"); //文件绝对路径 也可以使用相对路径
flash.setWindowFlags(Qt::FramelessWindowHint); //去除边框
flash.show();

//延迟5秒
QTime t;
t.start();
while(t.elapsed() < 5000)
{
QApplication::processEvents();
}

//主界面显示
MainWindow w;
w.show();
flash.close();

二、QT 实现软件启动动画与加载进度(实现)

下面是一个完整的 QT 实现方案,包含启动动画、主界面加载和进度条显示功能。

功能说明

实现启动动画,在等待主界面出现之前加载动画,主界面加载完成后动画结束,显示主界面,启动动画是一个图片加从一个点到四个点的加载动画

代码

1. 自定义启动画面类 (animatedsplash.h)

#ifndef ANIMATEDSPLASH_H
#define ANIMATEDSPLASH_H

#include <QSplashScreen>
#include <QTimer>
#include <QPainter>

class AnimatedSplash : public QSplashScreen
{
    Q_OBJECT
public:
    explicit AnimatedSplash(const QPixmap &background, QWidget *parent = nullptr);
    ~AnimatedSplash();

    void setLoadingDotsColor(const QColor &color);
    void setLoadingDotsRadius(int radius);
    void setLoadingDotsSpacing(int spacing);

protected:
    void drawContents(QPainter *painter) override;

private slots:
    void updateAnimation();

private:
    QTimer *m_animationTimer;
    int m_dotPosition;  // 当前动画位置 (0-3)
    QColor m_dotsColor;
    int m_dotsRadius;
    int m_dotsSpacing;
    QPixmap m_background;
};

#endif // ANIMATEDSPLASH_H

2. 自定义启动画面实现 (animatedsplash.cpp)

#include "AnimatedSplash.h"
#include <QApplication>
#include <QPainter>

AnimatedSplash::AnimatedSplash(const QPixmap &background, QWidget *parent)
    : QSplashScreen(background),
    m_dotPosition(0),
    m_dotsColor(Qt::white),
    m_dotsRadius(8),
    m_dotsSpacing(20),
    m_background(background)
{
    // 设置动画定时器
    m_animationTimer = new QTimer(this);
    connect(m_animationTimer, &QTimer::timeout, this, &AnimatedSplash::updateAnimation);
    m_animationTimer->start(300);  // 每300ms更新一次动画

    // 设置窗口属性
    setFixedSize(background.size());
    setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
}

AnimatedSplash::~AnimatedSplash()
{
    m_animationTimer->stop();
    delete m_animationTimer;
}

void AnimatedSplash::setLoadingDotsColor(const QColor &color)
{
    m_dotsColor = color;
}

void AnimatedSplash::setLoadingDotsRadius(int radius)
{
    m_dotsRadius = radius;
}

void AnimatedSplash::setLoadingDotsSpacing(int spacing)
{
    m_dotsSpacing = spacing;
}

void AnimatedSplash::drawContents(QPainter *painter)
{
    // 先绘制背景图
    QSplashScreen::drawContents(painter);

    // 计算加载点的中心Y位置(距离底部50像素)
    int centerY = height() - 50;
    int startX = width() / 2 - (m_dotsRadius * 2 + m_dotsSpacing * 1.5);

    // 绘制"启动中"文字
    painter->setPen(m_dotsColor);  // 使用相同的颜色
    painter->setOpacity(1.0);      // 完全不透明
    QFont font = painter->font();
    font.setPixelSize(m_dotsRadius * 6);  // 设置合适的字体大小
    painter->setFont(font);

    // 计算文字位置(在第一个点左侧留出空间)
    int textWidth = painter->fontMetrics().horizontalAdvance("启动中");
    int textX = startX - textWidth - m_dotsSpacing;  // 在第一个点左侧留出一个间距

    painter->drawText(textX, centerY + m_dotsRadius, "启动中");

    // 绘制5个点
    for (int i = 0; i < 5; ++i) {
        // 当前点是否应该高亮(根据动画位置)
        bool isActive = (i == m_dotPosition);
        qreal opacity = isActive ? 1.0 : 0.3;
        int radius = isActive ? m_dotsRadius : m_dotsRadius * 0.8;

        painter->setPen(Qt::NoPen);
        painter->setBrush(m_dotsColor);
        painter->setOpacity(opacity);

        int x = startX + i * (m_dotsRadius * 2 + m_dotsSpacing);
        painter->drawEllipse(QPoint(x, centerY), radius, radius);
    }

    // 重置画笔设置
    painter->setOpacity(1.0);
}
void AnimatedSplash::updateAnimation()
{
    m_dotPosition = (m_dotPosition + 1) % 4;
    update();  // 触发重绘
}

3. 主程序入口 (main.cpp)

#include "lectotype/lectotype.h"
#include "MainWindow/functionWindow.h"
#include <QApplication>
#include <QStyleFactory>
#include <QThread>
#include "CustomSplash/animatedsplash.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // Lectotype w;
    // w.show();

    // 设置应用程序样式
    //QApplication::setStyle(QStyleFactory::create("Fusion"));

    // 1. 创建并显示自定义启动画面
    QPixmap splashPix("F:/DELTA/DELTA/bin/res/Functionwindow/alarm.png"); // 启动背景图
    AnimatedSplash splash(splashPix);

    // 自定义加载点样式
    splash.setLoadingDotsColor(QColor(255, 215, 0)); // 金色
    splash.setLoadingDotsRadius(6);
    splash.setLoadingDotsSpacing(15);

    splash.show();
    a.processEvents(); // 确保界面能立即更新

    // 2. 在后台创建并加载主窗口
    FunctionWindow *w=new FunctionWindow();

    // 3. 加载完成后显示主窗口,关闭启动画面
    splash.finish(w);
    w->show();

    return a.exec();
}


网站公告

今日签到

点亮在社区的每一天
去签到