Qt 实现软件启动界面动画

实现软件启动界面,用到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对象。
  2. 显示和隐藏:

    • void show():显示启动画面。
    • void finish(QWidget *mainWindow):隐藏启动画面,并将其关联到指定的主窗口。在调用此函数之前,通常会在显示主窗口前执行一些初始化任务。
    • void clearMessage():清除启动画面上显示的消息。
  3. 位图相关:

    • void setPixmap(const QPixmap &pixmap):设置启动画面使用的位图。
    • const QPixmap *pixmap() const:返回启动画面使用的位图的指针。
  4. 消息显示:

    • void showMessage(const QString &message, int alignment = Qt::AlignBottom | Qt::AlignCenter, const QColor &color = Qt::black):在启动画面上显示消息。可以设置消息的对齐方式和颜色。
  5. 其他:

    • 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();
        }
    }
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Qt 是一个跨平台的 C++ 库,用于创建图形用户界面和应用程序。Qt 提供了丰富的功能和工具,以简化图形界面开发过程。 在 Qt 中,可以使用多线程来实现动画启动界面。多线程能够将界面的渲染和逻辑处理分离,提高程序的响应性和用户体验。 首先,需要在主线程中创建一个启动界面的窗口,并设置该窗口为应用程序的主窗口,使其在程序启动时显示。在启动界面窗口中,可以添加一张图片或者一个动画控件,来展示用户需要的信息或者动画效果。 然后,在主线程中创建一个子线程,并在该子线程中执行后台任务和动画的逻辑处理。可以使用 QtQThread 类来创建和管理子线程。 在子线程中,可以使用 QTimer 控件来定时更新动画效果,并使用 QObject::moveToThread() 函数将动画控件或者需要更新的界面元素移动到子线程中进行渲染。 同时,需要保证子线程能够与主线程进行通信,以便在后台任务完成或动画效果更新时及时更新界面。可以使用 Qt 的信号和槽机制来进行线程间的通信。 最后,在主线程中,等待后台任务完成的信号,并在接收到信号后关闭启动界面窗口,显示应用程序的主窗口。 通过以上步骤,就可以实现一个使用多线程的启动界面动画。这样可以提高程序的响应速度,使用户在启动过程中能够看到动画效果,提升用户体验。同时,由于界面渲染和逻辑处理在不同线程中进行,可以减少界面卡顿的情况,保证程序的流畅性。 ### 回答2: 在Qt中,我们可以使用多线程来实现动画启动界面。下面是一个简单的示例: 首先,我们需要创建一个继承自QThread的自定义线程类。在这个线程类中,我们可以定义我们想要的动画效果。例如,可以使用QPropertyAnimation来实现一个渐变的启动界面动画。 接下来,在主线程中,我们可以通过创建一个实例化的自定义线程类对象。然后,我们可以将该线程对象启动,并在主线程中显示我们的启动界面。 下面是一个简单的示例代码: ```cpp #include <QApplication> #include <QMainWindow> #include <QThread> #include <QPropertyAnimation> class AnimationThread : public QThread { public: void run() override { // 创建一个QPropertyAnimation对象,设置动画效果 QPropertyAnimation animation; animation.setTargetObject(/* 设置动画目标对象,可以是QWidget或其他可动画化的对象 */); animation.setPropertyName(/* 设置动画属性,例如透明度 */); animation.setStartValue(/* 设置起始值 */); animation.setEndValue(/* 设置结束值 */); animation.setDuration(/* 设置动画时长 */); // 启动动画 animation.start(); // 等待动画结束 animation.wait(); } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); QMainWindow mainWindow; mainWindow.show(); // 创建并启动动画线程 AnimationThread animationThread; animationThread.start(); // 显示启动界面,并等待动画线程结束 // 在动画线程结束后关闭启动界面 // ... return a.exec(); } ``` 需要注意的是,在实际的应用中,我们可能需要在动画线程结束后关闭启动界面,并继续执行其他任务。这需要根据具体的需求进行调整。 希望以上的回答能对您有所帮助! ### 回答3: Qt动画启动界面是通过多线程实现的。在启动界面中,主线程负责界面的初始化和显示,而动画效果则通过子线程来实现。 首先,主线程会负责创建启动界面的窗口,并设置窗口的初始属性和界面布局。然后,子线程被创建并启动,其中包含动画实现代码。 在子线程中,通常使用Qt动画框架来实现动画效果。可以使用QPropertyAnimation类来控制对象的属性变化,并通过设置动画的起始值和结束值来实现动画效果的过渡。另外,也可以使用QSequentialAnimationGroup或QParallelAnimationGroup来管理多个动画的协同播放。 子线程中的动画会在启动界面显示之前就开始播放。在动画播放过程中,主线程会不断更新界面,以实时显示动画的效果。 同时,为了确保动画的流畅播放,需要注意线程之间的同步与通信。可以使用Qt的信号与槽机制,通过在子线程中发送信号,再在主线程中接收信号,并根据信号内容来更新界面。 总而言之,Qt动画启动界面通过多线程的方式实现,主线程负责界面的初始化和显示,子线程负责动画实现,通过信号与槽机制来实现线程之间的同步与通信,以实现流畅的动画效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FreeLikeTheWind.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值