Qt 实现软件启动界面动画
  yQAl4kecrO8W 2023年12月23日 37 0


实现软件启动界面,用到QSplashScreen类。

效果


启动界面


描述

QSplashScreen小部件提供了一个可以在应用程序启动期间显示的启动画面。
启动画面通常是在应用程序启动时显示的小部件。启动画面通常用于启动时间较长的应用程序(例如需要花费一些时间来建立连接的数据库或网络应用程序),以向用户提供应用程序正在加载的反馈信息。

启动画面会出现在屏幕的中央。如果希望将启动画面保持在所有其他窗口之上,在启动画面的窗口标志中添加Qt::WindowStaysOnTopHint可能会很有用。

一些X11窗口管理器不支持"窗口保持在顶部"标志。解决方法是设置一个定时器,定期对启动画面调用raise()函数,以模拟"窗口保持在顶部"的效果。

最常见的用法是在显示主窗口之前显示启动画面。
下面的代码片段演示了此用法,其中显示了一个启动画面并在显示应用程序的主窗口前执行一些初始化任务:

main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QPixmap pixmap(":/splash.png");
    QSplashScreen splash(pixmap);
    splash.show();
    app.processEvents();
    ...
    QMainWindow window;
    window.show();
    splash.finish(&window);
    return app.exec();
}

用户可以通过鼠标单击来隐藏启动画面。由于启动画面通常显示在事件循环开始运行之前,因此需要定期调用QApplication::processEvents()来接收鼠标点击事件。

有时候需要更新启动画面上的消息例如,在应用程序启动期间通知已经建立的连接或加载的模块:

QPixmap pixmap(":/splash.png");
QSplashScreen *splash = new QSScreen(pixmap);
splash->show();

... // 加载一些项
splash->showMessage("已加载模块");

qApp->processEvents();

... // 建立连接
splash->showMessage("正在建立连接");

qApp->processEvents();

QSplashScreen支持使用showMessage()函数进行这样的操作。如果希望进行自定义绘制,可以使用pixmap()函数获取启动画面使用的位图的指针。或者,可以子类化QSplashScreen并重新实现drawContents()函数。

常用函数

  1. 构造函数:
  • QSplashScreen(const QPixmap &pixmap = QPixmap(), Qt::WindowFlags f = Qt::WindowFlags()):使用给定的位图和窗口标志构造一个QSplashScreen对象。
  1. 显示和隐藏:
  • void show():显示启动画面。
  • void finish(QWidget *mainWindow):隐藏启动画面,并将其关联到指定的主窗口。在调用此函数之前,通常会在显示主窗口前执行一些初始化任务。
  • void clearMessage():清除启动画面上显示的消息。
  1. 位图相关:
  • void setPixmap(const QPixmap &pixmap):设置启动画面使用的位图。
  • const QPixmap *pixmap() const:返回启动画面使用的位图的指针。
  1. 消息显示:
  • void showMessage(const QString &message, int alignment = Qt::AlignBottom | Qt::AlignCenter, const QColor &color = Qt::black):在启动画面上显示消息。可以设置消息的对齐方式和颜色。
  1. 其他:
  • void raise():将启动画面置于顶层。
  • bool isFullScreen() const:判断启动画面是否为全屏模式。
  • void setEnabled(bool enabled):设置启动画面是否可用。
  • void setAutoFillBackground(bool enabled):设置是否自动填充启动画面的背景。

子类化示例

.h

#ifndef SCREEN_H
#define SCREEN_H

#include <QWidget>
#include <QSplashScreen>

namespace Ui {
class C_Screen;
}

class C_Screen : public QSplashScreen
{
    Q_OBJECT

public:
    explicit C_Screen(QWidget *parent = nullptr);
    ~C_Screen();

private:
    Ui::C_Screen *ui;
};

#endif // SCREEN_H

.cpp

#include "Screen.h"
#include "ui_Screen.h"

#include <QPixmap>
#include <QFont>

C_Screen::C_Screen(QWidget *parent) :
    QSplashScreen(parent),
    ui(new Ui::C_Screen)
{
    ui->setupUi(this);

    QString strScreen = ":/images/screen1.png";

    QFont font = this->font();
    font.setPixelSize(23);
    setFont(font);

    QPixmap loadingPix(strScreen);
    setPixmap(loadingPix);
    
}

C_Screen::~C_Screen()
{
    delete ui;
}

在.main调用

C_Screen screen;
    screen.show();
    screen.showMessage("程序正在加载......", Qt::AlignTop|Qt::AlignRight, Qt::red);
    QDateTime time = QDateTime::currentDateTime();
    QDateTime currentTime = QDateTime::currentDateTime();   //记录当前时间
    // 可以添加处理业务
    while (time.msecsTo(currentTime) <= 1000)                   //1000为需要延时的毫秒数
    {
        currentTime = QDateTime::currentDateTime();
    }
    for(int i = 0; i < 3; ++i)
    {
        screen.showMessage(QString("请稍等%1......").arg(3-i), Qt::AlignTop|Qt::AlignRight, Qt::red);
        time = currentTime;
        while (time.msecsTo(currentTime) <= 1000)                   //1000为需要延时的毫秒数
        {
            currentTime = QDateTime::currentDateTime();
        }
    }


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月23日 0

暂无评论

推荐阅读
yQAl4kecrO8W