Qt启动动画(<QSplashScreen>)

在启动运行qt项目时,加入了启动的动画,让项目感觉更好一点,同时用于一些嵌入式设备,加载动画的同时可以进行项目自检,检查设备是否安全正确,没有出现损伤。

运行结果

下图是运行的结果,启动动画加上加载进度条。

实现代码

下面是实现控件的h文件和c文件,注释详细

h文件
复制代码
#ifndef SPLASHSCREEN_H
#define SPLASHSCREEN_H

#include <QSplashScreen>
#include <QLabel>
#include <QProgressBar>
#include <QVBoxLayout>
#include <QPainter>

class SplashScreen : public QSplashScreen
{
    Q_OBJECT

public:
    // 构造函数,接受一个QPixmap作为背景图片,和一个可选的父窗口指针
    SplashScreen(const QPixmap &pixmap, QWidget *parent = nullptr);
    ~SplashScreen(); // 析构函数

public slots:
    void setProgress(int value); // 设置进度条的值
    void setMessage(const QString &message); // 设置消息文本
    void start(int duration); // 启动进度条,接受一个持续时间作为参数

protected:
    void drawContents(QPainter *painter) override; // 重写绘制内容函数

private:
    QLabel *messageLabel; // 用于显示消息的标签
    QProgressBar *progressBar; // 进度条
};

#endif // SPLASHSCREEN_H
C文件
复制代码
#include "mysplashscreen.h"
#include <QApplication>
#include <QScreen>
#include <QStyle>
#include <QPainter>

// 构造函数
SplashScreen::SplashScreen(const QPixmap &pixmap, QWidget *parent)
    : QSplashScreen(pixmap, Qt::WindowStaysOnTopHint | Qt::SplashScreen)  // 调用QSplashScreen的构造函数,设置窗口标志
{
    // 设置布局
    QVBoxLayout *layout = new QVBoxLayout;
    layout->setContentsMargins(10, 10, 10, 10); // 设置内边距
    setLayout(layout); // 设置布局

    // 创建消息标签
    messageLabel = new QLabel(this);
    messageLabel->setAlignment(Qt::AlignLeft | Qt::AlignTop); // 设置对齐方式
    messageLabel->setStyleSheet("color: white;"); // 设置样式表,设置文字颜色为白色
    layout->addWidget(messageLabel); // 将标签添加到布局中

    // 创建进度条
    progressBar = new QProgressBar(this);
    progressBar->setMaximum(100); // 设置进度条的最大值为100
    progressBar->setValue(0); // 设置进度条的初始值为0
    // 设置进度条的样式表,设置颜色
    progressBar->setStyleSheet(
        "QProgressBar {"
        "   border: 2px solid grey;"
        "   border-radius: 5px;"
        "   text-align: center;"
        "}"
        "QProgressBar::chunk {"
        "   background-color: #05B8CC;"
        "   width: 10px;"
        "   margin: 0.5px;"
        "}");
    layout->addWidget(progressBar); // 将进度条添加到布局中

    // 设置启动画面的几何位置和大小
    setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, size(), qApp->primaryScreen()->geometry()));

    // 初始化显示
    show();
}

// 析构函数
SplashScreen::~SplashScreen()
{
}

// 设置进度条的值
void SplashScreen::setProgress(int value)
{
    progressBar->setValue(value); // 设置进度条的值
    repaint(); // 更新显示
}

// 设置消息文本
void SplashScreen::setMessage(const QString &message)
{
    messageLabel->setText(message); // 设置标签的文本
    repaint(); // 更新显示
}

// 启动进度条
void SplashScreen::start(int duration)
{
    for (int i = 0; i < duration; ++i)
    {
        int progress = i * 100 / duration; // 计算进度
        setProgress(progress); // 设置进度
        setMessage(QString("Loading... %1%").arg(progress)); // 设置消息
        QApplication::processEvents(); // 处理事件,保持界面响应
    }
}

// 重写绘制内容函数
void SplashScreen::drawContents(QPainter *painter)
{
    // 调用基类的绘制内容函数
    QSplashScreen::drawContents(painter);
}
main函数调用

通过设置参数,来设置动画启动的时间

复制代码
#include "TcpClientLogin.h"
#include "mysplashscreen.h"
#include <QApplication>
#include <QFile>
#include <QTextStream>

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

    // 创建并显示启动画面
        QPixmap pixmap(":/res/pic/1.png");
        SplashScreen *splash = new SplashScreen(pixmap);

        // 开始启动画面
        splash->start(10000);
    QFile file(":/res/qss/style-4.qss");/*QSS文件所在的路径*/

    file.open(QFile::ReadOnly);
    QTextStream filetext(&file);
    QString stylesheet = filetext.readAll();
    a.setStyleSheet(stylesheet);
    file.close();

    MainWindow w;

    w.show();
    splash->finish(&w);

    delete splash;

    return a.exec();
}
相关推荐
Felix_One1 天前
Qt 串口通信避坑指南:QSerialPort 的 5 个常见问题
qt
blasit4 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
郑州光合科技余经理9 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1239 天前
matlab画图工具
开发语言·matlab
dustcell.9 天前
haproxy七层代理
java·开发语言·前端
norlan_jame9 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone9 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054969 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
遥遥江上月9 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
m0_531237179 天前
C语言-数组练习进阶
c语言·开发语言·算法