【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()

相关推荐
许彰午13 分钟前
13-describe元数据输出
java·低代码·架构·状态模式
用户3721574261351 小时前
Java 设置 Word 文档编辑限制并允许指定区域编辑
java
宠友信息2 小时前
社区类源码开发实践中的仿小红书系统技术要点分析
java·spring boot·redis·mysql·uni-app·vue·内容运营
用户3721574261352 小时前
Java 设置 PDF 表单域只读或扁平化
java
OceanBase数据库官方博客2 小时前
亮相“十五五”公积金高质量发展大会“AI 数据库”助力智慧公积金升级
数据库·人工智能
龙虾PRO3 小时前
高并发场景数据库调优实操:目标定位、监控方法与优化维度全解析
数据库·oracle
达梦产品与服务3 小时前
SQLark 实战 | 高频 SQL 脚本的导入、管理与复用
数据库·sql·数据库开发·数据库运维·脚本管理·sqlark百灵连接·sql脚本
luteres3 小时前
Spring学习笔记
java·后端·spring
南城以南溫暖如初1473 小时前
从零搭建24小时自助健身系统:技术选型与核心模块实战
java·spring boot·redis·mysql·vue·mybatis
重生之后端学习3 小时前
53. 最大子数组和[中等]✅
java·数据结构·算法·leetcode·职场和发展