QSplashScreen 讲解

QSplashScreen 是 Qt 提供的一个用于显示启动画面的类,常用于在应用程序启动时显示一个临时的提示窗口,告诉用户程序正在加载。它通常用来展示一个图片(如应用程序的 logo 或启动信息),直到应用的主窗口准备好显示为止。

QSplashScreen 的主要特性

  • 显示图片:可以在启动画面中显示图片(通常是程序的 logo 或者加载提示)。
  • 置顶显示:启动画面通常会置于所有窗口之上,以确保用户可以立即看到。
  • 支持更新状态:你可以在程序加载过程中使用 showMessage() 来在启动画面上显示加载状态信息(如“正在加载数据”)。
  • 控制显示时间:你可以手动控制启动画面的显示时间,或者在主窗口加载完成时自动隐藏它。

QSplashScreen 使用步骤

  1. 创建并显示 QSplashScreen
  2. 加载主窗口或耗时任务
  3. 主窗口加载完成后,关闭 QSplashScreen

QSplashScreen 的简单示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <QApplication>
#include <QMainWindow>
#include <QSplashScreen>
#include <QThread>

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

// 创建 QSplashScreen 对象并显示启动图片
QSplashScreen splash;
splash.setPixmap(QPixmap(":/resources/splash_image.png")); // 设置启动图片
splash.show();

// 强制刷新以确保显示启动画面
QCoreApplication::processEvents();

// 模拟加载过程,例如初始化一些数据
QThread::sleep(3); // 假装主窗口加载需要 3 秒

// 创建主窗口
QMainWindow mainWindow;
mainWindow.show();

// 主窗口显示后,隐藏启动画面
splash.finish(&mainWindow);

return app.exec();
}

关键点解释

  1. QSplashScreen splash:创建一个 QSplashScreen 对象,并设置启动图片(setPixmap())。
  2. splash.show():启动画面显示在屏幕上。
  3. QCoreApplication::processEvents():确保启动画面立即刷新,避免显示延迟。
  4. QThread::sleep(3):模拟主窗口加载过程中的延迟。实际使用中,加载数据或初始化复杂组件通常会耗时。
  5. splash.finish(&mainWindow):当主窗口准备好显示时,调用 finish() 隐藏启动画面。

QSplashScreen 的主要功能和常用方法

  • QSplashScreen::setPixmap(const QPixmap &):设置启动画面显示的图片。
  • QSplashScreen::showMessage(const QString &message, int alignment = Qt::AlignLeft, const QColor &color = Qt::black):在启动画面上显示状态消息(如“正在加载… ”)。
  • QSplashScreen::clearMessage():清除启动画面上的文字信息。
  • QSplashScreen::finish(QWidget *mainWin):当主窗口加载完成时,调用该方法关闭启动画面。
  • QSplashScreen::close():立即关闭启动画面。

显示启动信息(使用 showMessage()

在应用程序启动时,通常会显示一些加载状态信息。QSplashScreen 提供了 showMessage() 方法,可以在启动画面的指定位置显示文字信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <QApplication>
#include <QMainWindow>
#include <QSplashScreen>
#include <QThread>

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

QSplashScreen splash;
splash.setPixmap(QPixmap(":/resources/splash_image.png"));
splash.show();

// 显示加载状态信息
splash.showMessage("Loading modules...", Qt::AlignBottom | Qt::AlignCenter, Qt::white);
QCoreApplication::processEvents(); // 强制刷新

QThread::sleep(2); // 模拟加载模块

splash.showMessage("Initializing data...", Qt::AlignBottom | Qt::AlignCenter, Qt::white);
QCoreApplication::processEvents(); // 强制刷新

QThread::sleep(2); // 模拟初始化数据

QMainWindow mainWindow;
mainWindow.show();

splash.finish(&mainWindow);

return app.exec();
}

设置启动画面为置顶

为了确保启动画面能够始终位于其他窗口的上方,QSplashScreen 默认会使用窗口标志 Qt::SplashScreen,这会使启动画面保持在其他窗口的上方。

你可以手动设置 QSplashScreen 的窗口标志,使其保持置顶:

1
splash.setWindowFlags(Qt::WindowStaysOnTopHint | Qt::SplashScreen);

QSplashScreen 的常见问题与注意事项

  1. 主线程阻塞:如果启动画面显示过程中主线程被阻塞(如大量数据加载或复杂的初始化任务),用户界面可能会卡住。为避免卡顿,应该尽量在后台线程中执行耗时操作,或者通过 QCoreApplication::processEvents() 保持事件循环的运行。

  2. 鼠标点击无响应:默认情况下,QSplashScreen 不会响应用户的鼠标点击。如果你希望用户点击启动画面关闭它,可以捕获鼠标事件并手动处理:

1
splash.setWindowFlags(Qt::WindowStaysOnTopHint | Qt::SplashScreen | Qt::WindowTransparentForInput);

这种方式使启动画面仍然显示,但不会阻止其他窗口接收输入。

总结

  • QSplashScreen 用于在应用启动时显示一个启动画面,通常用于加载状态的展示。
  • 可以通过 setPixmap() 设置启动图片,通过 showMessage() 显示加载状态信息。
  • QSplashScreen 的主要特点是显示一个图片并保持在顶层,直到主窗口准备好显示。

-------------本文结束感谢您的阅读-------------