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();
}
相关推荐
随意02313 分钟前
Qt 事件
开发语言·qt
鸥梨菌Honevid21 分钟前
Qt自定义控件(1)——QPaintEvent
开发语言·qt
Code季风24 分钟前
深入比较 Gin 与 Beego:Go Web 框架的两大选择
开发语言·golang·go·gin·beego
专注VB编程开发20年2 小时前
javascript的类,ES6模块写法在VSCODE中智能提示
开发语言·javascript·vscode
黄雪超9 小时前
JVM——函数式语法糖:如何使用Function、Stream来编写函数式程序?
java·开发语言·jvm
ThetaarSofVenice9 小时前
对象的finalization机制Test
java·开发语言·jvm
思则变9 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
lijingguang9 小时前
在C#中根据URL下载文件并保存到本地,可以使用以下方法(推荐使用现代异步方式)
开发语言·c#
¥-oriented10 小时前
【C#中路径相关的概念】
开发语言·c#
CoderCodingNo10 小时前
【GESP】C++四级考试大纲知识点梳理, (7) 排序算法基本概念
开发语言·c++·排序算法