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();
}
相关推荐
小林熬夜学编程1 分钟前
【MySQL】第九弹---掌握SQL关键操作:更新、删除、插入与聚合分析的秘诀
linux·开发语言·数据库·mysql
hhw1991125 分钟前
JavaScript知识点1
开发语言·前端·javascript
+7204 小时前
如何在java中用httpclient实现rpc get请求
java·qt·rpc
a0023450014 小时前
python类型转换&深浅拷贝
开发语言·python
2301_766536055 小时前
调试无痛入手
开发语言·前端
+7205 小时前
Java 的 HttpClient 中使用 POST 请求传递参数
java·开发语言
@大迁世界6 小时前
构建 Next.js 应用时的安全保障与风险防范措施
开发语言·前端·javascript·安全·ecmascript
水瓶丫头站住7 小时前
Qt中QRadioButton的样式设置
开发语言·qt
@hdd8 小时前
深入理解 QObject的作用
qt