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

相关推荐
用户128526116028 小时前
我把祖传Java项目重构后,接口响应从3s砍到了200ms,只改了这几行代码
java
Linsk8 小时前
组件 = 模板 + 业务逻辑
java·前端·vue.js
Nturmoils9 小时前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT
数据库
星沉远浦9 小时前
用Gemini高效解决Java代码报错难以定位的问题
java
用户2986985301412 小时前
Word 文档字符级格式化:Java 实现方案详解
java·后端
渣波13 小时前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码
javascript·数据库·后端
笨鸟飞不快13 小时前
从单个服务到集群:一次完整的性能排查复盘
java·前端
荣码13 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
SamDeepThinking13 小时前
Java微服务练习方式
java·后端·微服务
朦胧之1 天前
AI 编程-老项目改造篇
java·前端·后端