Qt5.14.2 程序的华丽开场,让Splash窗口释放无限可能!


作为一款有追求的优秀软件,启动时的那个小小的Splash窗口可谓是程序的形象大使,它展现着软件精雕细琢的品味和非凡的待客之道。今天,就让我们一同领略Qt对这个"开场小品"的深谙之道——Splash窗口设计,感受一番Qt大神们在程序启动体验上的非凡追求!


一、初现锋芒:简单入门


在Qt的世界里,设计Splash窗口就是如此的直白而优雅。我们只需在代码中创建一个QSplashScreen对象,就轻松拥有了一个默认外观的Splash窗口:

QSplashScreen *splash = new QSplashScreen;
splash->show();

就这么简单!QSplashScreen类为我们提供了Splash窗口的全部基本功能,让程序拥有了精美的启动画面。这种直白的设计哲学,正体现了Qt大神们"美从自然"的编程智慧。

当然,就止步于此未免也太过简陋了些。让我们进一步打扮这个Splash窗口,为即将登场的程序增添些许仪式感:

QSplashScreen *splash = new QSplashScreen(QPixmap(":/images/splash.png"));
splash->showMessage("Loading...");
splash->show();

这次我们在构造时传入了一个QPixmap参数,使Splash窗口使用自定义的启动画面。showMessage()则让我们可以在窗口上显示启动提示文本,增强用户体验。

不过,请相信Qt大神们的城府,QSplashScreen可不只是这些小把戏。让我们继续探索它更深层的能力吧!


二、狂放绽放:行云流水


除了基本的显示功能,QSplashScreen还为我们提供了多种方式,让Splash窗口的表现力发挥到了极致。

首先,我们可以通过连接Qt信号槽机制,动态改变Splash窗口的显示内容。比如说,根据程序加载进度实时更新进度条:

QSplashScreen *splash = new QSplashScreen;
QProgressBar *progBar = new QProgressBar(splash);
progBar->setMaximum(100);
progBar->setGeometry(10, splash->height() - 50, splash->width() - 20, 20);qApp->processEvents(); // 确保Splash窗口显示出来for (int i = 0; i <= 100; i++) {progBar->setValue(i);qApp->processEvents();QThread::msleep(30); // 模拟加载进度
}splash->finish(mainWin);
delete splash;

这段代码创建了QSplashScreen和QProgressBar,并将QProgressBar显示到Splash窗口上。通过定时器或类似机制,我们就能动态更新QProgressBar的值,为用户提供形象的加载进度反馈。最后,在加载完成后,我们调用finish()方法关闭Splash窗口,并将主窗口mainWin显示出来。

除了进度条,QSplashScreen对于文本、图像等多媒体内容也有着无与伦比的驾驭能力。我们甚至可以在Splash窗口上播放视频动画,给用户精彩绝伦的开场体验!


三、终之,静待主角


当Splash窗口扮演完它的角色后,QSplashScreen依然有dongf最后的"临门一脚"。Qt大神们精心设计了一个showMessage()的重载版本,允许我们设置主窗口显示前执行的回调函数:

QSplashScreen *splash = new QSplashScreen;// 在主窗口显示前执行某些代码
auto cleanup = [=](QWidget *mainWin){// 处理数据...
};splash->showMessage("Ready", Qt::AlignBottom, Qt::white);
splash->show();QTimer::singleShot(3000, [=](){splash->showMessage("Go!", Qt::AlignBottom, Qt::white);mainWin = new MainWindow;splash->finish(mainWin, cleanup);delete splash;
});

这段精巧的代码展示了两个精彩绝伦的技巧:

  1. 我们使用QTimer::singleShot()设置了一个延时,模拟加载过程。在3秒后,Splash窗口上的消息会变为"Go!",制造出期待感;
  2. 在调用finish()方法时,我们传入了cleanup回调,让Splash窗口在真正显示主窗口之前,能够先执行一些"最后的扫尾工作"。

四、设置Splash窗口的显示时长


控制Splash窗口的显示时长是一个常见的需求。除了在程序加载完毕后手动关闭,Qt还为我们提供了几种其他方法来设置Splash窗口的显示时长:


1、使用QTimer延时

最直观的方法是使用QTimer来设置一个延时,在延时到期后自动关闭Splash窗口:

QSplashScreen *splash = new QSplashScreen;
splash->show();QTimer::singleShot(3000, [=](){splash->close();delete splash;
});

这段代码通过QTimer::singleShot()函数设置一个3秒的延时,3秒后自动调用QSplashScreen::close()关闭Splash窗口。


2、使用QSplashScreen::setPixmap()版本


QSplashScreen有一个重载的setPixmap()方法,它允许我们同时设置Splash窗口的显示图像和持续时间:

QSplashScreen *splash = new QSplashScreen;
splash->setPixmap(QPixmap(":/splash.png"), Qt::WindowStaysOnTopHint | Qt::SplashScreen, 5000);

这里setPixmap()的第三个参数就是以毫秒为单位的显示时长。5秒后,Splash窗口将自动关闭。


3、直接继承并重写QSplashScreen

对于更复杂的需求,我们还可以考虑直接继承QSplashScreen类,并重写其各种虚函数,从而获得对Splash窗口行为的完全控制权:

class MySplash : public QSplashScreen
{Q_OBJECT
public:MySplash(const QPixmap &pixmap) : QSplashScreen(pixmap) {startTimer(5000); // 5秒后触发timerEvent}protected:void timerEvent(QTimerEvent *e) override {Q_UNUSED(e);close(); // 时间到,关闭窗口}
};

这个示例中,我们自定义了MySplash类继承自QSplashScreen,在构造函数中启动了一个5秒的定时器。一旦定时器超时,就会触发timerEvent()函数,我们在其中调用close()关闭Splash窗口。

通过上述多种方法,我们就可以轻松地控制Splash窗口的显示时长了。根据不同的场景需求,选择最合适的方式即可。值得一提的是,如果程序加载时间比预期时长长,我们也可以在加载完毕后立即关闭Splash窗口,避免它无谓地停留在界面上。


五、Splash使用技巧和注意事项


在使用QSplashScreen时,Qt大神们还为我们留下了一些使用技巧和注意事项,以帮助我们更好地利用Splash窗口,优化程序的启动体验:

1、及早创建Splash对象

要让Splash窗口尽早显示,我们最好在主函数入口就创建并显示QSplashScreen对象。这样可以避免程序在加载初始化过程中出现"闪屏"的情况,给用户更好的视觉体验。


2、使用事件循环和processEvents()

由于Splash窗口是个临时窗口,没有自己的事件循环。为了确保它可以正常绘制和响应,我们需要在主事件循环之前调用QApplication::processEvents()。让我们看一个示例:

int main(int argc, char *argv[]) {QApplication app(argc, argv);QSplashScreen *splash = new QSplashScreen;splash->show();// 处理事件,确保Splash窗口显示app.processEvents(); // 其他初始化工作...MainWindow mainWin;splash->finish(&mainWin);delete splash;return app.exec();
}

3、密切关注消息循环和连接顺序


Splash窗口可能会影响到程序的消息循环和事件分发。为了避免窗口无响应等问题,我们需要注意Qt对象之间信号连接的顺序,确保Splash窗口相关的操作在其他窗口之前得到处理。

  • 合理控制显示时长

Splash窗口旨在提供良好的启动体验,但显示时间过长就失去了它的意义。我们应该合理地控制它的持续时间,比如在程序加载完毕后立即将其关闭。

  • 谨慎使用多线程

尽管QSplashScreen是窗口类,但它并不是线程安全的。如果我们需要在多线程环境下使用Splash窗口,就必须非常小心,仔细处理线程同步等问题。

  • 标准化Splash样式

Splash窗口是软件的"第一面",反映了品牌形象。因此我们可以考虑遵循统一的规范,标准化Splash窗口的设计风格,使其与整个应用程序的视觉体验保持一致。

  • 例行测试不同场景

不同的系统环境和使用场景可能会影响到Splash窗口的表现。所以我们有必要在各种条件下,反复测试并优化Splash窗口的显示效果,确保其稳定可靠。


通过上述种种堪称绝世的能力,QSplashScreen让软件的启动过程不再是简单的加载,而变成了一个引人入胜的小小剧场。我们可以尽情施展创意,为程序的开场制造无限的惊喜。

所以,当你下次写一个Qt程序时,可要多花些心思精心打造一番Splash窗口啊!因为有了QSplashScreen在,绝对能让你的软件从一开场就脱颖而出,给用户留下深刻的印象。

借助这些宝贵经验,相信我们一定能最大限度地发挥QSplashScreen的威力,打造出视觉炫酷、交互友好的程序启动体验。与此同时,让我们也继续保持学习的热情,期待Qt带给我们更多的惊喜!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/782763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python数据分析九

一、Python之列表操作方法remove和pop 在Python中&#xff0c;列表还提供了其他一些常用的操作方法&#xff0c;例如删除指定元素和弹出&#xff08;移除并返回&#xff09;指定位置的元素。其中&#xff0c;remove()方法用于删除列表中第一个匹配的元素&#xff0c;而pop()方…

python基础——异常捕获【try-except、else、finally】

&#x1f4dd;前言&#xff1a; 这篇文章主要介绍一下python基础中的异常处理&#xff1a; 1&#xff0c;异常 2&#xff0c;异常的捕获 3&#xff0c;finally语句 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;C语言入门基础以及python入门…

【C++】右值引用

目录 前言&#xff1a;一、左值引用和右值引用1.1 什么是左值和左值引用1.2 什么是右值和右值引用 二、左值引用和右值引用比较三、右值引用使用场景3.1 传值返回使用场景3.2 移动构造3.3 移动赋值3.4 STL容器接口也增加右值引用3.5 完美转发 前言&#xff1a; 引用是给对象取…

HarmonyOS 应用开发之模型切换

本文介绍如何将一个FA模型开发的声明式范式应用切换到Stage模型&#xff0c;您需要完成如下动作&#xff1a; 工程切换&#xff1a;新建一个Stage模型的应用工程。 配置文件切换&#xff1a;config.json切换为app.json5和module.json5。 组件切换&#xff1a;PageAbility/Serv…

不同的batch_size对精度和损失的影响研究

1 问题 不同的batch_size对训练集和验证集的精度和损失的影响有多大&#xff1f; 2 方法 通过设置不同batch_size算出不同batch_size对应的训练集精度、训练集损失和验证集的精度和损失&#xff0c;通过数据可视化将精度和损失展示出来&#xff0c;比较出不同batch_size对他们的…

CTK插件框架学习-插件注册调用(03)

CTK插件框架学习-新建插件(02)https://mp.csdn.net/mp_blog/creation/editor/136923735 一、CTK插件组成 接口类&#xff1a;对外暴露的接口&#xff0c;供其他插件调用实现类&#xff1a;实现接口内的方法激活类&#xff1a;负责将插件注册到CTK框架中 二、接口、插件、服务…

文生视频大模型Sora的复现经验

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

Web墨卡托投影和普通墨卡托投影是一样的吗?Web墨卡托投影与EPSG:3857坐标系的关系,EPSG:3857坐标系和EPSG:4326坐标系有什么区别?

Web墨卡托投影和普通墨卡托投影在本质上是相同的,但它们在坐标范围使用单位和应用领域上存在一些区别: 坐标范围: 普通墨卡托投影的坐标范围通常在整个地球表面上,由于使用浮点数表示,所以不限制其范围。Web墨卡托投影的坐标范围通常被限制在一个固定的范围内,以适应Web地…

BFS专题

1、BFS解决FloodFill算法 1、1图像渲染 733. 图像渲染 - 力扣(LeetCode) class Solution {typedef pair<int,int> PII;int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0}; public:vector<vector<int>> floodFill(vector<vector<int>>& i…

RIP环境下的MGRE 综合实验

实验题目及要求&#xff1a; 1.R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有IP地址 2.R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方; R2于R5之间使用PPP的chap认证&#xff0c;R5为主认证方&#xff1b; R3于R5之间使用HDLC封装。 3.R1/…

python保存中间变量(学习笔记)

python保存中间变量 原因&#xff1a; 最近在部署dust3r算法&#xff0c;虽然在本地部署了&#xff0c;也能测试出一定的结果&#xff0c;但是发现无法跑很多图片&#xff0c;为了能够测试多张图片跑出来的模型&#xff0c;于是就在打算在autodl上部署算法&#xff0c;但是由…

【C++】为什么能实现函数重载

从C语言一路学到C的途中&#xff0c;C语言C语言相比&#xff0c;多了个函数重载&#xff0c;那么函数重载是如何实现的呢&#xff0c;为什么C语言无法支持&#xff0c;在本篇博客中&#xff0c;将会讲解C为何能实现函数重载。 一.编译过程 C能实现函数重载&#xff0c;而C语言不…

QT 二维坐标系显示坐标点及点与点的连线-通过定时器自动添加随机数据点

QT 二维坐标系显示坐标点及点与点的连线-通过定时器自动添加随机数据点 功能介绍头文件C文件运行过程 功能介绍 上面的代码实现了一个简单的 Qt 应用程序&#xff0c;其功能包括&#xff1a; 创建一个 MainWindow 类&#xff0c;继承自 QMainWindow&#xff0c;作为应用程序的…

2024软件设计师备考讲义——UML(统一建模语言)

UML的概念 用例图的概念 包含 <<include>>扩展<<exted>>泛化 用例图&#xff08;也可称用例建模&#xff09;描述的是外部执行者&#xff08;Actor&#xff09;所理解的系统功能。用例图用于需求分析阶段&#xff0c;它的建立是系统开发者和用户反复…

Pyppeteer中Chromium安装步骤

1、下载压缩文件 在官网下载chrome-win.zip文件 2、终端下载pyppeteer 首先在Pycharm终端运行pip install pyppeteer 3、查找文件默认路径 在运行以下代码&#xff0c;找到可执行文件默认路径 import pyppeteer.chromium_downloader print(默认版本是&#xff1a;{}.forma…

牛角工具箱源码 轻松打造个性化在线工具箱

&#x1f389; Whats this&#xff1f; 这是一款在线工具箱程序&#xff0c;您可以通过安装扩展增强她的功能 通过插件模板的功能&#xff0c;您也可以把她当做网页导航来使用~ 觉得该项目不错的可以给个Star~ &#x1f63a; 演示地址 https://tool.aoaostar.com &#x1f…

sql注入相关题目

1.ctf.show_web10 &#xff08;1&#xff09;$regex "/(select|from|where|join|sleep|and|\s|union|,)/i"; &#xff08;2&#xff09;没有回显 &#xff08;3&#xff09;只要用户名密码正确&#xff0c;即可得到flag usernameadmin/**/or/**/11/**/group/**/…

TCP网络协议栈和Posix网络部分API总结

文章目录 Posix网络部分API综述TCP协议栈通信过程TCP三次握手和四次挥手&#xff08;看下图&#xff09;三次握手常见问题&#xff1f;为什么是三次握手而不是两次&#xff1f;三次握手和哪些函数有关&#xff1f;TCP的生命周期是从什么时候开始的&#xff1f; 四次挥手通信状态…

HarmonyOS实战开发-如何实现一个自定义抽奖圆形转盘

介绍 本篇Codelab是基于画布组件、显式动画&#xff0c;实现的一个自定义抽奖圆形转盘。包含如下功能&#xff1a; 通过画布组件Canvas&#xff0c;画出抽奖圆形转盘。通过显式动画启动抽奖功能。通过自定义弹窗弹出抽中的奖品。 相关概念 Stack组件&#xff1a;堆叠容器&am…

从0开始搭建基于VUE的前端项目(一) 项目创建和配置

准备与版本 安装nodejs(v20.11.1)安装vue脚手架(@vue/cli 5.0.8) ,参考(https://cli.vuejs.org/zh/)vue版本(2.7.16),vue2的最后一个版本vue.config.js的配置详解(https://cli.vuejs.org/zh/config/)element-ui(2.15.14)(https://element.eleme.io/)vuex(3.6.2) (https://…