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

发布于:2025-07-16 ⋅ 阅读:(18) ⋅ 点赞:(0)

方案一:使用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最常见的用法是在屏幕上显示主窗体之前显示启动画面。

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();
}

另外使用消息更新启动画面也很有用,比如在程序启动时宣布已建立连接或加载模块:

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();
}

如果有多个屏幕,也可以在与主屏幕不同的屏幕上显示启动画面:

// 实现其他屏幕的初始屏幕
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()


网站公告

今日签到

点亮在社区的每一天
去签到