【QT】实现应用程序启动画面

方案一:使用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()。

相关推荐
码云数智-园园4 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
老板一杯拿铁4 小时前
Java 异常体系详解:从字节码原理到最佳实践
java
蜗牛互联网4 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端
禾小西4 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
我不是阵雨4 小时前
JDK 21虚拟线程Pinning陷阱:一文拔钉解困
java·开发语言
小卡车5555 小时前
java反射、自定义注解的应用(自定义分页)
java
hz567895 小时前
涉密视频会议设备配置指南:终端、音视频采集与配套设施选型
服务器·网络·数据库·安全·实时音视频·信息与通信·智能硬件
广州浮点FLOATLIC5 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
程序员Sunday5 小时前
MySQL 为什么使用 B+ 树索引?把范围查询、回表和覆盖索引连起来
数据库·mysql
BLUcoding6 小时前
接口服务公网超时排查记录:SecureRandom 阻塞问题分析与解决
java·linux·springboot·aes·securerandom