【Qt之QSplashScreen】开场动画使用:进度条加载及设置鼠标指针不转圈
效果
开场动画效果如下:
开场动画
介绍
QSplashScreen小部件提供了一个启动屏幕,可以在应用程序启动期间显示。
启动屏幕是一个小部件,通常在应用程序启动时显示。启动屏幕通常用于启动时间较长的应用程序(例如需要花费时间建立连接的数据库或网络应用程序),以便向用户提供应用程序正在加载的反馈。
启动画面出现在屏幕中央。添加Qt::WindowStaysOnTopHint到splash小部件的窗口标志可能是有用的,如果你想让它在桌面上的所有其他窗口之上。
一些X11窗口管理器不支持“停留在顶部”标志。一个解决方案是设置一个计时器,定期调用启动屏幕上的raise()来模拟“停留在顶部”的效果。
最常见的用法是在主小部件显示在屏幕上之前显示一个闪屏。下面的代码片段说明了这一点,在显示应用程序的主窗口之前,会显示一个闪屏,并执行一些初始化任务:
int main(int argc, char *argv[]){QApplication app(argc, argv);// 添加像素图QPixmap pixmap(":/splash.png");QSplashScreen splash(pixmap);// 显示splash.show();app.processEvents();...QMainWindow window;window.show();// 完成splash.finish(&window);// 事件循环return app.exec();}
用户可以通过点击鼠标来隐藏闪屏。由于闪屏通常是在事件循环开始运行之前显示的,因此有必要定期调用QApplication::processEvents()来接收鼠标点击。
有时用消息更新启动屏幕是有用的,例如,在应用程序启动时宣布连接建立或模块加载:
QPixmap pixmap(":/splash.png");QSplashScreen *splash = new QSplashScreen(pixmap);splash->show();... // Loading some itemssplash->showMessage("Loaded modules");qApp->processEvents();... // Establishing connectionssplash->showMessage("Established connections");qApp->processEvents();
QSplashScreen通过showMessage()函数支持这一点。如果你想自己绘图,你可以使用pixmap()获得一个指向启动屏幕中使用的像素图的指针。或者,你可以继承QSplashScreen并重新实现drawContents()。
使用场景
QSplashScreen的使用场景包括但不限于以下几种情况:
启动时间较长的应用程序:对于启动时间较长、需要后台进行大量初始化的应用程序,QSplashScreen可以提供一个简单的启动画面,向用户展示应用程序正在加载,而不是让用户在空白或未响应的界面上等待。这有助于改善用户体验,让用户知道程序正在后台进行必要的准备工作。需要显示加载进度的应用程序:如果应用程序在启动过程中需要进行大量数据处理或资源加载,QSplashScreen可以提供一个包含加载进度信息的界面。通过QSplashScreen的自定义功能,可以实时更新加载进度,让用户了解程序启动的进度情况。需要展示程序名称、版本信息的应用程序:QSplashScreen可以显示应用程序的名称和版本信息,这对于一些需要向用户展示程序基本信息的应用程序来说是非常有用的。通过在启动画面上显示这些信息,用户可以更直观地了解正在运行的应用程序的身份和版本。需要实现渐变效果的应用程序:QSplashScreen支持设置透明度和渐变效果,可以让启动画面在显示过程中逐渐淡入或淡出,增加视觉效果。这对于一些需要追求精美效果的应用程序来说是非常合适的。需要进行连接数据库或网络的应用程序:对于需要连接数据库或网络的应用程序,QSplashScreen可以在连接过程中显示一些提示信息或进度条,让用户知道程序正在进行连接操作。这有助于改善用户体验,让用户知道应用程序正在执行特定的任务。
总的来说,QSplashScreen的使用场景主要是那些需要在应用程序启动时提供视觉反馈、加载进度、基本信息展示以及需要实现渐变效果和连接数据库或网络的应用程序。通过使用QSplashScreen,这些应用程序可以在启动过程中提供更好的用户体验和视觉效果。
方法
-
QSplashScreen::QSplashScreen(const QPixmap &pixmap = QPixmap(), Qt::WindowFlags f = Qt::WindowFlags())
构造一个显示 pixmap 的启动画面(Splash Screen)。
除了可能使用 Qt::WindowStaysOnTopHint 标志外,通常不需要设置其他绘件标志。 -
QSplashScreen::QSplashScreen(QWidget *parent, const QPixmap &pixmap = QPixmap(), Qt::WindowFlags f = Qt::WindowFlags())
这是一个重载函数。
该函数允许您为启动画面指定一个父窗口。此构造函数的典型用途是当您拥有多个屏幕,并希望在启动画面上显示于主要屏幕不同的屏幕上。在这种情况下,将适当的 desktop() 作为父窗口传递进来。 -
[virtual] QSplashScreen::~QSplashScreen()
析构函数。 -
[slot] void QSplashScreen::clearMessage()
清除在启动画面上显示的消息。
参见 showMessage()。 -
[virtual protected] void QSplashScreen::drawContents(QPainter *painter)
使用 painter 绘制启动画面的内容。默认实现会绘制 showMessage() 传递的消息。如果您想要在启动画面上进行自定义绘制,请重新实现此函数。 -
[virtual protected] bool QSplashScreen::event(QEvent *e)
从 QObject::event() 重新实现。 -
void QSplashScreen::finish(QWidget *mainWin)
使启动画面在显示 mainWin 窗口后再调用自己的 close() 函数。 -
QString QSplashScreen::message() const
返回当前在启动画面上显示的消息。 -
[signal] void QSplashScreen::messageChanged(const QString &message)
当启动画面上的消息发生变化时,发出此信号。message 是新消息,在消息被清除时为一个空字符串。 -
[virtual protected] void QSplashScreen::mousePressEvent(QMouseEvent *)
从 QWidget::mousePressEvent() 重新实现。 -
const QPixmap QSplashScreen::pixmap() const
返回用于显示启动画面的 pixmap。该图像不包含通过 showMessage() 绘制的任何文本。 -
void QSplashScreen::repaint()
此方法覆盖了 QWidget::repaint()。与标准的 repaint 函数不同,它还调用 QApplication::processEvents(),以确保更新的内容能够被显示,即使没有事件循环。 -
void QSplashScreen::setPixmap(const QPixmap &pixmap)
设置用作启动画面图像的 pixmap。 -
[slot] void QSplashScreen::showMessage(const QString &message, int alignment = Qt::AlignLeft, const QColor &color = Qt::black)
使用 color 颜色将消息文本绘制到启动画面上,并根据 alignment 中的标志对齐文本。此函数调用 repaint() 来确保启动画面立即更新。因此,消息可以根据应用程序的动作(例如,加载文件)及时更新。
示例
.h
#ifndef CUSTOMSPLASHSCREEN_H
#define CUSTOMSPLASHSCREEN_H#include <QSplashScreen>// 前置声明
QT_FORWARD_DECLARE_CLASS(QProgressBar)/*** @brief The CustomSplashScreen class 自定义开场动画类*/
class CustomSplashScreen : public QSplashScreen
{Q_OBJECT
public:explicit CustomSplashScreen(QWidget *parent = nullptr);// 初始化void init();private:// 进度条QProgressBar* m_pProgressBar;
};#endif // CUSTOMSPLASHSCREEN_H
.cpp
#include "customsplashscreen.h"#include <QPixmap>
#include <QThread>
#include <QDateTime>
#include <QApplication>
#include <QProgressBar>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QDebug>#define DELAYTIME 1000 // DELAYTIME为需要延时的毫秒数
#define SHOWNO 3 // 显示加载次数CustomSplashScreen::CustomSplashScreen(QWidget *parent) : QSplashScreen(parent)
{QString strScreen = "./ss.jpg";QFont font = this->font();font.setPixelSize(23);setFont(font);// 设置像素图QPixmap loadingPix(strScreen);setPixmap(loadingPix.scaled(500, 300));// 进度条m_pProgressBar = new QProgressBar(this);m_pProgressBar->setRange(0 ,100);m_pProgressBar->setValue(0);m_pProgressBar->setStyleSheet("QProgressBar{color:#ff0000;}");QLabel* pLabel = new QLabel("加载中...");pLabel->setStyleSheet("QLabel {color:#ff0000; font-weight: bold; font-style: italic; font-size: 23px;}");QHBoxLayout* pHB = new QHBoxLayout();pHB->addStretch();pHB->addWidget(pLabel);pHB->addStretch();QVBoxLayout* pVB = new QVBoxLayout(this);pVB->addStretch();pVB->addLayout(pHB);pVB->addWidget(m_pProgressBar);this->setLayout(pVB);
}void CustomSplashScreen::init()
{// 先设置显示,再设置显示信息,如果设置完显示信息再设置显示,会看不到show();// 设置鼠标指针不转圈QApplication::setOverrideCursor(Qt::ArrowCursor);// 显示信息,及文本对齐方式:右上, 字体:redshowMessage("程序正在加载...", Qt::AlignTop|Qt::AlignRight, Qt::red);QDateTime time = QDateTime::currentDateTime();QDateTime currentTime = QDateTime::currentDateTime(); // 记录当前时间m_pProgressBar->setValue(0);int nInter = time.msecsTo(currentTime);while(nInter <= DELAYTIME){currentTime = QDateTime::currentDateTime();m_pProgressBar->setValue(0.025*nInter);nInter = time.msecsTo(currentTime);}for(int i = 0; i < SHOWNO; ++i){showMessage(QString("请稍等%1...").arg(SHOWNO-i), Qt::AlignTop|Qt::AlignRight, Qt::red);time = currentTime;nInter = time.msecsTo(currentTime);while(nInter <= DELAYTIME){currentTime = QDateTime::currentDateTime();m_pProgressBar->setValue(25*(i+1) + 0.025*nInter);nInter = time.msecsTo(currentTime);}}m_pProgressBar->setValue(100);
}
main.cpp
#include "mainwindow.h"
#include <QApplication>#include "customsplashscreen.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);CustomSplashScreen ss;// 初始化ss.init();MainWindow w;w.show();// 动画结束ss.finish(&w);return a.exec();
}
完整示例链接
完整示例链接见文章最上方。
相关文章:
【Qt之QSplashScreen】开场动画使用:进度条加载及设置鼠标指针不转圈
效果 开场动画效果如下: 开场动画 介绍 QSplashScreen小部件提供了一个启动屏幕,可以在应用程序启动期间显示。 启动屏幕是一个小部件,通常在应用程序启动时显示。启动屏幕通常用于启动时间较长的应用程序(例如需要花费时间建立连接的数据…...
WPF Button点击鼠标左键弹出菜单
目录 ContextMenu介绍WPF实现点击鼠标左键弹出菜单如何禁用右键菜单如何修改菜单样式菜单位置设置 本篇博客介绍WPF点击按钮弹出菜单,效果如下: 菜单的位置、央视可以自定义。 实现技巧:不在xaml里菜单,在按钮左键按下的点击事件里…...
http库requests
http库requests requets简介第一个requestsrequests发送基本的HTTP请求requests处理请求参数requests处理响应requests处理Cookiesrequests处理sessionrequests使用代理requests设置请求头requests处理SSL证书验证requests错误处理和异常处理requests连接池requests请求重试...
package.json 依赖版本中的符号含义
依赖包的版本问题 实例说明~1.2.3主版本次要版本补丁版本;1.2.3 < version < 1.3.0;~1.2主版本次要版本;1.2.0 < version < 1.3.0~1主版本;1.0.0 < version < 2.0.0 符号实例版本范围说明1.0.01.0.0锁定1.0.0版本,必须这个版本。^会匹配最新的大…...
Python try except 用法
关键字解释trytry 就是执行代码的部分,但是对这部分代码没有信心就试一试嘛,这就是tryexcept很不幸,试的时候有错误,没事儿,except 帮你来兜底,它会输出错误,并继续执行下去else程序没有错误&am…...
代码随想录二刷 | 链表 | 翻转链表
代码随想录二刷 | 链表 | 翻转链表 题目描述解题思路 & 代码实现双指针法递归法 206.翻转链表 题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4…...
每日一题(LeetCode)----链表--两两交换链表中的节点
每日一题(LeetCode)----链表–两两交换链表中的节点 1.题目([24. 两两交换链表中的节点](https://leetcode.cn/problems/spiral-matrix/)) 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内…...
竞赛选题 身份证识别系统 - 图像识别 深度学习
文章目录 0 前言1 实现方法1.1 原理1.1.1 字符定位1.1.2 字符识别1.1.3 深度学习算法介绍1.1.4 模型选择 2 算法流程3 部分关键代码 4 效果展示5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计 图像识别 深度学习 身份证识别…...
什么时候用@MapperScan 注解?
hello,我是小索奇,给大家讲解一下MapperScan注解的用法。 MapperScan 注解是 MyBatis 框架中的一个注解,它的主要作用是扫描指定包路径下的 Mapper 接口,将其注册为 Spring 的 Bean。这样,在使用 MyBatis 进行数据库操作时&#…...
MQTT.js
MQTT.js mqtt.js简介MQTT测试工具mqttboxMQTTX mqtt使用mqtt引入(方式一)mqtt引入(方式二)创建mqtt客户端连接到mqtt代理订阅topic处理接收到的消息重新连接取消订阅发布消息断开连接关闭客户端MQTT APIMQTT在VUE中使用MQTT在Reac…...
html滑动文章标题置顶
position: sticky; 基于用户的滚动位置来定位 首先封装一个组件 例如:AAA组件(注意,只能有一层盒子,不能在外面继续包一层div) <template><div class"box">{{title}}</div> </templa…...
Android11 桌面默认横屏导致任务键近期任务布局UI显示错误!
/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java 定义变量:private boolean stch false; keyCode KeyEvent.KEYCODE_APP_SWITCH 取消原来逻辑,采用广播打开近期任务后台 /*/ if (!keyguardOn…...
「Verilog学习笔记」根据状态转移图实现时序电路
专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 这是一个典型的米利型状态机。三段式即可解决。 米利型状态机:即输出不仅和当前状态有关,也和输入有关。 其中ST0,ST1,ST3的…...
使用DHorse发布SpringBoot项目到K8S
前言 在介绍DHorse的操作之前,先来介绍一下使用k8s发布应用的步骤,以SpringBoot应用为例进行说明。 1.首先从代码仓库下载代码,比如GitLab; 2.接着进行构建,比如使用Maven; 3.如果要使用k8s作为编排&am…...
Java修仙记之记录一次与前端女修士论道的经历
文章开始之前,想跟我念一句:福生无量天尊,无量寿佛,阿弥陀佛 第一场论道:id更新之争 一个天气明朗的下午,前端的小美女长发姐告诉我:嘿,小后端,你的代码报错了 我答道&am…...
初识linux(1)
文章目录 什么是linux什么是操作系统?开源 怎么装linux的环境基础指令lspwdcdtouchmkdirrmdir与rmmancpmv 什么是linux linux是一款开源操作系统 什么是操作系统? 操作系统:一种对计算机所有计算机软硬件进行控制和管理的系统软件 开源 开源&…...
投资黄金:如何选择正确的黄金品种增加收益?
黄金一直以来都是备受投资者青睐的避险资产,然而,在庞大的黄金市场中,选择适合自己的黄金品种成为影响收益的关键因素。黄金投资并不只有一种方式,而是有很多种不同的黄金品种可以选择。每种黄金品种都有其独特的特点和风险&#…...
Rust错误处理机制:优雅地管理错误
大家好!我是lincyang。 今天,我们要探讨的是Rust语言中的错误处理机制。 Rust作为一种系统编程语言,对错误处理的重视程度是非常高的。它提供了一套既安全又灵活的机制来处理可能出现的错误。 Rust错误处理的两大类别 在Rust中࿰…...
docker-compose安装harbor
docker-compose安装harbor 环境:centos7 1、安装docker 官方文档 https://docs.docker.com/engine/install/centos/ 1、卸载旧版本 $ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate …...
【python学习】基础篇-常用模块-shutil文件和目录操作
shutil模块是Python标准库中的一个模块,提供了对文件和目录进行高级操作的函数。 以下是shutil模块的一些常用函数: 1.复制文件: 将源文件src复制到目标文件dst。如果follow_symlinks为True,则会跟随符号链接。 shutil.copy(src, dst, *, f…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
