【Qt之QSplashScreen】开场动画使用:进度条加载及设置鼠标指针不转圈

效果

开场动画效果如下:

开场动画

介绍

QSplashScreen小部件提供了一个启动屏幕,可以在应用程序启动期间显示。

启动屏幕是一个小部件,通常在应用程序启动时显示。启动屏幕通常用于启动时间较长的应用程序(例如需要花费时间建立连接的数据库或网络应用程序),以便向用户提供应用程序正在加载的反馈。

启动画面出现在屏幕中央。添加Qt::WindowStaysOnTopHintsplash小部件的窗口标志可能是有用的,如果你想让它在桌面上的所有其他窗口之上。

一些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的使用场景包括但不限于以下几种情况:

  1. 启动时间较长的应用程序:对于启动时间较长、需要后台进行大量初始化的应用程序,QSplashScreen可以提供一个简单的启动画面,向用户展示应用程序正在加载,而不是让用户在空白或未响应的界面上等待。这有助于改善用户体验,让用户知道程序正在后台进行必要的准备工作。
  2. 需要显示加载进度的应用程序:如果应用程序在启动过程中需要进行大量数据处理或资源加载,QSplashScreen可以提供一个包含加载进度信息的界面。通过QSplashScreen的自定义功能,可以实时更新加载进度,让用户了解程序启动的进度情况。
  3. 需要展示程序名称、版本信息的应用程序QSplashScreen可以显示应用程序的名称和版本信息,这对于一些需要向用户展示程序基本信息的应用程序来说是非常有用的。通过在启动画面上显示这些信息,用户可以更直观地了解正在运行的应用程序的身份和版本。
  4. 需要实现渐变效果的应用程序QSplashScreen支持设置透明度和渐变效果,可以让启动画面在显示过程中逐渐淡入或淡出,增加视觉效果。这对于一些需要追求精美效果的应用程序来说是非常合适的。
  5. 需要进行连接数据库或网络的应用程序:对于需要连接数据库或网络的应用程序,QSplashScreen可以在连接过程中显示一些提示信息或进度条,让用户知道程序正在进行连接操作。这有助于改善用户体验,让用户知道应用程序正在执行特定的任务。

总的来说,QSplashScreen的使用场景主要是那些需要在应用程序启动时提供视觉反馈、加载进度、基本信息展示以及需要实现渐变效果和连接数据库或网络的应用程序。通过使用QSplashScreen,这些应用程序可以在启动过程中提供更好的用户体验和视觉效果。

方法

  1. QSplashScreen::QSplashScreen(const QPixmap &pixmap = QPixmap(), Qt::WindowFlags f = Qt::WindowFlags())
    构造一个显示 pixmap 的启动画面(Splash Screen)。
    除了可能使用 Qt::WindowStaysOnTopHint 标志外,通常不需要设置其他绘件标志。

  2. QSplashScreen::QSplashScreen(QWidget *parent, const QPixmap &pixmap = QPixmap(), Qt::WindowFlags f = Qt::WindowFlags())
    这是一个重载函数。
    该函数允许您为启动画面指定一个父窗口。此构造函数的典型用途是当您拥有多个屏幕,并希望在启动画面上显示于主要屏幕不同的屏幕上。在这种情况下,将适当的 desktop() 作为父窗口传递进来。

  3. [virtual] QSplashScreen::~QSplashScreen()
    析构函数。

  4. [slot] void QSplashScreen::clearMessage()
    清除在启动画面上显示的消息。
    参见 showMessage()。

  5. [virtual protected] void QSplashScreen::drawContents(QPainter *painter)
    使用 painter 绘制启动画面的内容。默认实现会绘制 showMessage() 传递的消息。如果您想要在启动画面上进行自定义绘制,请重新实现此函数。

  6. [virtual protected] bool QSplashScreen::event(QEvent *e)
    从 QObject::event() 重新实现。

  7. void QSplashScreen::finish(QWidget *mainWin)
    使启动画面在显示 mainWin 窗口后再调用自己的 close() 函数。

  8. QString QSplashScreen::message() const
    返回当前在启动画面上显示的消息。

  9. [signal] void QSplashScreen::messageChanged(const QString &message)
    当启动画面上的消息发生变化时,发出此信号。message 是新消息,在消息被清除时为一个空字符串。

  10. [virtual protected] void QSplashScreen::mousePressEvent(QMouseEvent *)
    从 QWidget::mousePressEvent() 重新实现。

  11. const QPixmap QSplashScreen::pixmap() const
    返回用于显示启动画面的 pixmap。该图像不包含通过 showMessage() 绘制的任何文本。

  12. void QSplashScreen::repaint()
    此方法覆盖了 QWidget::repaint()。与标准的 repaint 函数不同,它还调用 QApplication::processEvents(),以确保更新的内容能够被显示,即使没有事件循环。

  13. void QSplashScreen::setPixmap(const QPixmap &pixmap)
    设置用作启动画面图像的 pixmap。

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

完整示例链接

完整示例链接见文章最上方。

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

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

相关文章

《Effective C++》条款15

在资源管理类中提供对原始资源的访问 class A {... }; int day(const A* ptr) {... } int main() {shared_ptr<A> ptr(new A);cout << day(ptr) << endl; } 这样写是错误的。因为day函数要求的参数是指针&#xff0c;而你传的实际上是一个对象。 如何解决呢&…

在docker下安装suiteCRM

安装方法&#xff1a; docker-hub来源&#xff1a;https://hub.docker.com/r/bitnami/suitecrm curl -sSL https://raw.githubusercontent.com/bitnami/containers/main/bitnami/suitecrm/docker-compose.yml > docker-compose.yml//然后可以在docker-compose.yml文件里修…

深度学习+opencv+python实现车道线检测 - 自动驾驶 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &am…

网络支付安全:面临的风险与防范策略

随着电子商务的繁荣和移动支付技术的发展&#xff0c;网络支付已成为全球消费者日常生活中不可或缺的一部分。然而&#xff0c;这种便捷的支付方式也带来了许多安全风险&#xff0c;这些风险可能威胁到用户的财务安全和个人隐私。本文将深入探讨网络支付面临的主要安全风险&…

HTML5学习系列之主结构

HTML5学习系列之主结构 前言HTML5主结构定义页眉定义导航定义主要区域定义文章块定义区块定义附栏定义页脚 具体使用总结 前言 学习记录 HTML5主结构 定义页眉 head表示页眉&#xff0c;用来表示标题栏&#xff0c;引导和导航作用的结构元素。 <header role"banner…

Java和JavaScript是一样的技术吗?

目录 一、Java 是什么 二、JavaScript 是什么 三、Java 和 JavaScript 的区别 一、Java 是什么 Java是一种广泛使用的计算机编程语言&#xff0c;最初由Sun Microsystems&#xff08;后被Oracle收购&#xff09;于1995年发布。Java是一种面向对象的语言&#xff0c;设计初衷…

qnx 工程目录创建工具 addvariant

文章目录 前言一、addvariant 是什么二、addvariant 使用实例1. variant names 参数说明2. 创建一个可执行文件工程3. 创建一个动态库工程 总结参考资料 前言 本文主要介绍如何在qnx 开发环境中创建工程目录及其相关的配置文件(common.mk, Makefile 文件等) 软件版本&#xff…

Java 注解

常见的注解 Override Overload Deprecated 过时 等..... /** *deprecated {link #方法名()}提示可替代方法 */ Deprecated 注解类:Annotion,给编译器进行执行 声明注解使用 interface,本质也是接口,也可以设置抽象方法,起到属性的作用 package java.lang.annotation…

1、LeetCode之两数之和

两数之和 给定一个整数数组 nums和一个目标值target&#xff0c;请你在该数组中找出和为目标值的那两个整数&#xff0c;并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复利用这个数组中同样的元素。 nums [2,7,11,15]target 9[0,1]枚…

图解未来:数据可视化引领智慧决策时代

图表和数据可视化在数据分析中的关键作用 引言&#xff1a; 在现代数据科学中&#xff0c;数据可视化扮演着至关重要的角色。通过图表和可视化工具&#xff0c;我们能够更直观、更有效地理解数据的分布、趋势和关联性。本文将深入讨论三个主要的数据可视化工具&#xff1a;mat…

mindspore mindyolo目标检测华为昇腾上推理使用、训练;华为OBS文件传输使用

参考&#xff1a; https://github.com/mindspore-lab/mindyolo 使用案例&#xff1a; https://github.com/mindspore-lab/mindyolo/blob/master/GETTING_STARTED.md 安装&#xff1a; pip install mindyolo特别注意opencv-python、opencv-python-headless版本问题&#xff0…

代码随想录算法训练营Day 53 || 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

1143.最长公共子序列 力扣题目链接 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也可以不删除任何…

Arthas(阿尔萨斯)--(三)

目录 一、Arthas学习 1、class/classloader相关命令一 1、sc 2、sm 2、class/classloader相关命令二 1、jad 2、mc 3、redefine 三、class/classloader相关命令三 一、Arthas学习 Arthas(阿尔萨斯)--(一) Arthas(阿尔萨斯)--(二) 1、class/classloader相关命令一 …

【手写数据库toadb】代码又更新了,增加了解析树,查询树,执行计划,向更多复杂SQL迈进了一步

toadb updated by 2023/11/15 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 …

003.文件描述符、重定向

1、文件描述符 文件描述符是与输入和输出流相关联的整数。最广为人知的文件描述符是stdin、stdout和stderr。我们可以将某个文件描述符的内容重定向到另一个文件描述符中。 在编写脚本的时候会频繁用到标准输入&#xff08;stdin&#xff09;、标准输出&#xff08;stdout&am…

Visual Studio Code配置c/c++环境

Visual Studio Code配置c/c环境 1.创建项目目录2.vscode打开项目目录3.项目中添加文件4.文件内容5.配置编译器6.配置构建任务7.配置调试设置 1.创建项目目录 d:\>mkdir d:\c语言项目\test012.vscode打开项目目录 3.项目中添加文件 4.文件内容 #include <iostream> u…

网络编程TCP/UDP通信

1 网络通信概述 1.1 IP 和端口 所有的数据传输&#xff0c;都有三个要素 &#xff1a;源、目的、长度。 怎么表示源或者目的呢&#xff1f;请看图 所以&#xff0c;在网络传输中需要使用“IP 和端口”来表示源或目的。 1.2 网络传输中的 2 个对象&#xff1a;server 和 cl…

nvidia-docker部署pytorch服务【GPU工作站】

文章目录 一、安装 Docker二、安装 NVIDIA Container Toolkit三、宿主机安装 cuda 和 nvidia-driver四、测试一、安装 Docker 可以参考这篇文章 https://blog.csdn.net/weixin_43721000/article/details/124237932 二、安装 NVIDIA Container Toolkit 参考nvidia官方 https:/…

C语言--字符串详解(多角度分析,什么是字符串?字符串如何存储?字符串如何应用?字符串常用的库函数有哪些?)

目录 一、前言 &#x1f4a6;什么是字符串 &#x1f4a6;字符串如何存储&#xff1f; 二、字符串常量和字符数组 &#x1f4a6;字符串常量 ✨什么是字符串常量&#xff1f; ✨字符串常量与指针 &#x1f4a6;字符数组 ✨字符数组的应用 &#x1f4a6;字符串常量与字符数组的…

Flink和Kafka连接时的精确一次保证

Flink写入Kafka两阶段提交 端到端的 exactly-once&#xff08;精准一次&#xff09; kafka -> Flink -> kafka 1&#xff09;输入端 输入数据源端的 Kafka 可以对数据进行持久化保存&#xff0c;并可以重置偏移量&#xff08;offset&#xff09; 2&#xff09;Flink内…