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

相关推荐
绝知此事6 分钟前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
无风听海12 分钟前
C# 隐式转换深度解析
java·开发语言·c#
lzhdim17 分钟前
SQL 入门 15:SQL 事务:从 ACID 到四种常见的并发问题
数据库·sql
瀚高PG实验室1 小时前
瀚高企业版V9.1.1在pg_restore还原备份文件时提示extract函数语法问题
数据库·瀚高数据库
一只大袋鼠1 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
TDengine (老段)1 小时前
TDengine Tag 设计哲学与 Schema 变更机制
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
德思特2 小时前
从 Dify 配置页理解 RAG 的重要参数
java·人工智能·llm·dify·rag
YOU OU2 小时前
Spring IoC&DI
java·数据库·spring
один but you2 小时前
从可变参数到 emplace:现代 C++ 性能优化的核心组合
java·开发语言
是码龙不是码农3 小时前
ThreadPoolExecutor 7 个核心参数详解
java·线程池·threadpool