方案一:使用QSplashScreen实现
QSplashScreen小部件提供可一个启动画面,在应用程序启动期间显示。
使用注意事项
使用QSplashScreen类需要添加头文件#include<QSplashScreen
;
编译配置要求:
- CMake需添加:find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets)
- qmake需添加:QT += widgets
注:该类继承自QWidget
详细说明
当应用程序启动时间较长时(如需要建立数据库连接或网络连接的场景),可通过QSplashScreen向用户展示加载状态。
QSplashScreen默认居中显示启动画面。如需保持画面置顶,可设置Qt::WindowsStaysOnTopHint标志。若该标志不被支持,可通过设置定时器调用raise()方法模拟置顶效果。
QSplashScreen最常见的用法是在屏幕上显示主窗体之前显示启动画面。
cpp
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 加载图像
QPixmap pixmap(":/2.png");
// 创建QSplashScreen对象
QSplashScreen splash(pixmap, Qt::WindowStaysOnTopHint);
// 显示splash
splash.show();
// 鼠标单击会隐藏启动画面,如果要使鼠标处理正常工作,在启动期间调用QApplication::processEvents()
a.processEvents();
MainWindow w;
w.show();
// 应用程序初始化完成,结束初始屏幕
splash.finish(&w);
return a.exec();
}
另外使用消息更新启动画面也很有用,比如在程序启动时宣布已建立连接或加载模块:
cpp
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPixmap pixmap(":/2.png");
QSplashScreen *splash = new QSplashScreen(pixmap, Qt::WindowStaysOnTopHint);
splash->show();
// 加载某些项
splash->showMessage("loaded some items");
QApplication::processEvents();
// 建立连接
splash->showMessage("Established connections");;
QApplication::processEvents();
QMainWindow w;
w.show();
// 应用程序初始化完成,结束初始屏幕
splash->finish(&w);
return a.exec();
}
如果有多个屏幕,也可以在与主屏幕不同的屏幕上显示启动画面:
cpp
// 实现其他屏幕的初始屏幕
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 获取屏幕数量
QScreen *screen = QApplication::screens().at(1);
QPixmap pixmap(":/2.png");
QSplashScreen splash(pixmap, Qt::WindowStaysOnTopHint);
splash.show();
a.processEvents();
QMainWindow w;
w.show();
splash.finish(&w);
return a.exec();
}
常用方法
QSplashScreen类提供5个公共方法:
finish()
:等待目标窗口显示后关闭启动画面message()
:获取当前显示的消息pixmap()
:获取当前使用的图像repaint()
:重绘画面并处理事件setPixmap()
:设置显示图像
提供1个protected方法:
drawContents()
:绘制画面内容
提供2个槽函数:
clearMessage()
:清除显示消息showMessage()
:显示指定文本
提供1个信号:
messageChanged()
:消息变化时触发
继承自该类的子类需要重新实现event()
、mousePressEvent()
。