QSplashScreen --软件启动前的交互

目录

QSplashScreen 类介绍

 使用方式

项目中使用

THPrinterSplashScreen头文件

 THPrinterSplashScreen实现代码

使用代码 

使用效果

 


QSplashScreen 类介绍

         QSplashScreen 是 Qt 中的一个类,用于显示启动画面。它通常在应用程序启动时显示,以向用户显示应用程序正在启动的状态。启动画面可以是一个图片,也可以是一个包含了文本、图片等内容的窗口。

QSplashScreen(const QPixmap &pixmap = QPixmap(), Qt::WindowFlags f = Qt::WindowFlags())

QSplashScreen(QWidget *parent, const QPixmap &pixmap = QPixmap(), Qt::WindowFlags f = Qt::WindowFlags())


virtual ~QSplashScreen()


void finish(QWidget *mainWin)

QString message() const


const QPixmap pixmap() const


void repaint()


void  setPixmap(const QPixmap &pixmap)

//slots
void clearMessage()
void showMessage(const QString &message, int alignment = Qt::AlignLeft, const QColor &color = Qt::black)

//protected 可以继承自绘
virtual void drawContents(QPainter *painter)
 

 使用方式

        以下是Qt官方文档给出的两种使用场景。

  作为主窗口启动前的启动动画

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

主窗口启动前软件启动提示信息

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

  ... // Loading some items
  splash->showMessage("Loaded modules");

  qApp->processEvents();

  ... // Establishing connections
  splash->showMessage("Established connections");

  qApp->processEvents();

项目中使用

        实际项目中如果软件启动比较耗时,一般需要根据软件的样式风格和互动需求自定义启动动画效果,此时virtual void drawContents(QPainter *painter) 和 repaint()就显得尤为重要。

        以下是根据自身项目,加载启动动画时显示软件版本信息和启动进度等信息,主要继承drawContents进行重绘。

THPrinterSplashScreen头文件

#ifndef THPrinterSplashScreenT_H
#define THPrinterSplashScreenT_H

#include <QSplashScreen>
#include "Common.h"

#define g_pSplashScreen Singleton<THPrinterSplashScreen>::getInstance()

class THPrinterSplashScreen : public QSplashScreen
{
	Q_OBJECT
	friend Singleton<THPrinterSplashScreen>;
public:
	//关闭自身前可以再次操作
	void finish(QWidget *w);
	//设置启动进度0-100
	void setProgressValue(int value);
	//设置启动提示信息 如库加载信息、数据库启动...
	void setTipStr(const QString&tipStr);

protected:
	//重写此函数 自定义绘制启动动画
	void drawContents(QPainter *painter) override;
private:
	THPrinterSplashScreen();
	~THPrinterSplashScreen() = default;

	QPixmap m_pixIcon;
	QPixmap m_picBackground;
	int     m_nProgressValue = 0;
	QString m_strTip;
};

#endif // THPrinterSplashScreenT_H

 THPrinterSplashScreen实现代码


#pragma execution_character_set("utf-8")


THPrinterSplashScreen::THPrinterSplashScreen()	
{
	m_picBackground.load(":/images/icon/background.png");
	m_pixIcon.load(":/images/icon/logo.png");
	setPixmap(m_picBackground);
	setWindowFlag(Qt::WindowStaysOnTopHint);
}

void THPrinterSplashScreen::finish(QWidget *w)
{
	setProgressValue(100);
	setTipStr("程序加载完成!");
	QSplashScreen::finish(w);
}

void THPrinterSplashScreen::setProgressValue(int value)
{
	if (isVisible() && value >= 0 && m_nProgressValue < value) {
		value = qBound(0, value,100);
		m_nProgressValue = value;
		repaint();
	}
}

void THPrinterSplashScreen::setTipStr(const QString&tipStr)
{
	if (isVisible() && !tipStr.isEmpty() && m_strTip != tipStr) {
		m_strTip = tipStr;
		repaint();
	}
}

void THPrinterSplashScreen::drawContents(QPainter *painter)
{
	QSplashScreen::drawContents(painter);
	int bg_w = m_picBackground.width();
	int bg_h = m_picBackground.height();
	int icon_w = m_pixIcon.width();
	int icon_h = m_pixIcon.height();

	//默认垂直方向dpi为96 防止不同设备分辨率不同字体差异过大
	float fFactor = logicalDpiY() / 96.0f; 
	int smallFontSize = qRound(10 * fFactor);
	int midFontSize = qRound(15 * fFactor);
	int bigFontSize = qRound(20 * fFactor);
	int fontGapSize = 6;
	int magrinGapSize = 10;
	int offset = -20;

	int icon_x = (bg_w - icon_w) / 2;
	int icon_y = (bg_h - icon_h) / 2  + offset;
	int text_name_y = (bg_h + icon_h) / 2 + magrinGapSize + offset;
	int text_TipStr_y = text_name_y + bigFontSize + fontGapSize;
	int text_version_y = bg_h - fontGapSize - midFontSize;

	QRect rect_Icon(icon_x, icon_y, icon_w, icon_h);//相对于parent 左上角坐标 长宽
	QRect rect_Name_Text(0, text_name_y, bg_w, bigFontSize + fontGapSize);
	QRect rect_TipStr_Text(0, text_TipStr_y, bg_w, smallFontSize + fontGapSize);
	QRect rect_Version_Text(0, text_version_y, bg_w, midFontSize + fontGapSize);

	// 绘制启动动画logo
	painter->drawPixmap(rect_Icon, m_pixIcon);

	//绘制软件名称
	auto font = painter->font();
	font.setBold(true);
	font.setPointSize(bigFontSize);
	painter->setFont(font);
	auto pen = painter->pen();
	pen.setColor(Qt::white);
	painter->setPen(pen);
	painter->drawText(rect_Name_Text, Qt::AlignCenter, tr("设备指纹烧录工具"));

	//绘制启动中提示信息
	font = painter->font();
	font.setBold(false);
	font.setPointSize(smallFontSize);
	painter->setFont(font);
	if (!m_strTip.isEmpty())
	{
		painter->drawText(rect_TipStr_Text, Qt::AlignCenter, m_strTip);
	}

	//绘制软件版本信息
	font = painter->font();
	font.setPointSize(midFontSize);
	painter->setFont(font);
	auto &strVersion = PmsUpDater::getVersion();
	if (!strVersion.isEmpty()) {
		painter->drawText(rect_Version_Text, Qt::AlignCenter, strVersion);
	}

	//在rect_Version_Text最右侧绘制软件启动进度
	if (m_nProgressValue >= 0) {
		rect_Version_Text.adjust(0, 0, -midFontSize, 0);
		painter->drawText(rect_Version_Text,
			Qt::AlignVCenter | Qt::AlignRight,
			QString("%1%").arg(m_nProgressValue));
	}
}

使用代码 

main函数中嵌入到软件主界面启动前后。

	int main(int argc, char *argv[])
	{
	
	    //...
		g_pSplashScreen->setProgressValue(0);
		g_pSplashScreen->show();
		PmsUpDater w;
		w.show();
		g_pSplashScreen->finish(&w);
		//...

		return a.exec();
    }

        在程序启动比较耗时的地方添加进度信息和提示信息,便于判断程序启动的状态,若程序启动失败也可作为定位失败位置的信息。

int THPrinter::Initial()
	{
        //...

	    //初始化SDK
	    InitialSdk();
		g_pSplashScreen->setTipStr("SDK初始化成功!");
	    g_pSplashScreen->setProgressValue(53);
		//...
		
	    //数据库连接开始
		g_pSplashScreen->setTipStr("数据库连接中...");
	    g_pSplashScreen->setProgressValue(56);
		//...
		//连接完成
		g_pSplashScreen->setTipStr("数据库连完成");
	    g_pSplashScreen->setProgressValue(57);
		//...
		
    }

使用效果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Vscode 使用】集合1

一、使用make工具管理工程 windows下&#xff0c;下载mingw64&#xff0c;配置好mingw64\bin 为 Win10系统全局变量后。 在mingw64/bin目录下找到mingw32-make.exe工具。复制一份改名为&#xff1a;make.exe&#xff0c;没错&#xff0c;就是那么简单&#xff0c;mingw64自带m…

PHP-create_function

[题目信息]&#xff1a; 题目名称题目难度PHP-create_function2 [题目考点]&#xff1a; create_function ( string args , string args , string code )[Flag格式]: SangFor{wWx5dEGHHhDUwmST4bpXwfjSzq43I6cz}[环境部署]&#xff1a; docker-compose.yml文件或者docker …

golang内存泄漏

golang也用了好几年了&#xff0c;趁着有空 整理归纳下&#xff0c;以后忘了好看下 一般认为 Go 10次内存泄漏&#xff0c;8次goroutine泄漏&#xff0c;1次是真正内存泄漏&#xff0c;还有1次是cgo导致的内存泄漏 1:环境 go1.20 win10 2:goroutine泄漏 单个Goroutine占用内存&…

Python Seaborn库使用指南:从入门到精通

1. 引言 Seaborn 是基于 Matplotlib 的高级数据可视化库,专为统计图表设计。它提供了更简洁的 API 和更美观的默认样式,能够轻松生成复杂的统计图表。Seaborn 在数据分析、机器学习和科学计算领域中被广泛使用。 本文将详细介绍 Seaborn 的基本概念、常用功能以及高级用法,…

修改与 Git 相关的邮箱

要修改与 Git 相关的邮箱信息&#xff0c;需要区分以下两种情况&#xff1a; 1. 修改 Git 提交时使用的邮箱&#xff08;影响提交记录&#xff09; Git 提交记录中的邮箱由本地 Git 配置的 user.email 决定&#xff0c;与 SSH 密钥无关。修改方法如下&#xff1a; 全局修改&a…

用PyTorch从零构建 DeepSeek R1:模型架构和分步训练详解

DeepSeek R1 的完整训练流程核心在于&#xff0c;在其基础模型 DeepSeek V3 之上&#xff0c;运用了多种强化学习策略。 本文将从一个可本地运行的基础模型起步&#xff0c;并参照其技术报告&#xff0c;完全从零开始构建 DeepSeek R1&#xff0c;理论结合实践&#xff0c;逐步…

基于SpringBoot的“流浪动物救助系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“流浪动物救助系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统…

从零开始玩转TensorFlow:小明的机器学习故事 5

图像识别的挑战 1 故事引入&#xff1a;小明的“图像识别”大赛 小明从学校里听说了一个有趣的比赛&#xff1a;“美食图像识别”。参赛者需要训练计算机&#xff0c;看一张食物照片&#xff08;例如披萨、苹果、汉堡等&#xff09;&#xff0c;就能猜出这是什么食物。听起来…

学习笔记--电磁兼容性EMC

一、基本概念 电磁兼容性&#xff08;Electromagnetic Compatibility&#xff0c;EMC&#xff09;是电子电气设备在特定电磁环境中正常工作的能力&#xff0c;同时不会对其他设备产生不可接受的电磁干扰。其核心目标是确保设备在共享的电磁环境中既能抵抗干扰&#xff0c;又能避…

unity学习51:所有UI的父物体:canvas画布

目录 1 下载资源 1.1 在window / Asset store下下载一套免费的UI资源 1.2 下载&#xff0c;导入import 1.3 导入后在 project / Asset下面可以看到 2 画布canvas&#xff0c;UI的父物体 2.1 创建canvas 2.1.1 画布的下面是 event system是UI相关的事件系统 2.2 canvas…

ArcGIS Pro中创建最低成本路径的详尽教程

一、引言 在地理信息系统&#xff08;GIS&#xff09;的应用场景中&#xff0c;路径分析扮演着至关重要的角色。而最低成本路径分析&#xff0c;则是路径分析中的一种高级应用&#xff0c;它综合考虑了地形、植被、土地利用类型等多种因素&#xff0c;通过加权计算得出一条从起…

地铁站内导航系统:基于蓝牙Beacon与AR技术的动态路径规划技术深度剖析

本文旨在分享一套地铁站内导航系统技术方案&#xff0c;通过蓝牙Beacon技术与AI算法的结合&#xff0c;解决传统导航定位不准确、路径规划不合理等问题&#xff0c;提升乘客出行体验&#xff0c;同时为地铁运营商提供数据支持与增值服务。 如需获取校地铁站内智能导航系统方案文…

在VSCode中接入deepseek

注册就送14元2000万tokens。 https://cloud.siliconflow.cn/i/rnbA6i6U各种大模型 下面介绍我是如如接入vscode的 左边生成一个key&#xff0c;呆会vscode要用&#xff0c;不然401. 打开vscod&#xff0c;电脑能上网。下插件。 下好要配置 点它一下。 要配置&#xff0c;全…

【Java项目】基于Spring Boot的简历系统

【Java项目】基于Spring Boot的简历系统 技术简介&#xff1a;采用Spring Boot框架、Java技术、MySQL数据库等实现。 系统简介&#xff1a;系统主要实现了管理员模块、用户模块二大部分。管理员登录进入简历系统可以查看首页、个人中心、用户管理、简历模板管理、模板类型管理、…

汽车零部件工厂如何通过ESD监控系统闸机提升产品质量

在汽车零部件工厂的生产过程中&#xff0c;静电带来的危害不容小觑。从精密的电子元件到复杂的机械部件&#xff0c;静电都可能成为影响产品质量的 “隐形杀手”。而 ESD 监控系统闸机的出现&#xff0c;为汽车零部件工厂解决静电问题、提升产品质量提供了关键的技术支持。 一、…

记录:Docker 安装记录

今天在安装 ollama 时发现无法指定安装目录&#xff0c;而且它的命令行反馈内容很像 docker &#xff0c;而且它下载的模型也是放在 C 盘&#xff0c;那么如果我 C 盘空间不足&#xff0c;就装不了 deepseek-r1:70b &#xff0c;于是想起来之前安装 Docker 的时候也遇到过类似问…

DPVS-5: 后端服务监控原理与测试

后端监控原理 被动监测 DPVS自带了被动监控&#xff0c;通过监控后端服务对外部请求的响应情况&#xff0c;判断服务器是否可用。 DPVS的被动监测&#xff0c;并不能获取后端服务器的详细情况&#xff0c;仅仅通过丢包/拒绝情况来发觉后端服务是否可用。 TCP session state…

第438场周赛:判断操作后字符串中的数字是否相等、提取至多 K 个元素的最大总和、判断操作后字符串中的数字是否相等 Ⅱ、正方形上的点之间的最大距离

Q1、判断操作后字符串中的数字是否相等 1、题目描述 给你一个由数字组成的字符串 s 。重复执行以下操作&#xff0c;直到字符串恰好包含 两个 数字&#xff1a; 从第一个数字开始&#xff0c;对于 s 中的每一对连续数字&#xff0c;计算这两个数字的和 模 10。用计算得到的新…

计算机毕业设计SpringBoot+Vue.js学科竞赛管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

2.24力扣-回溯电话号码的字母组合

17. 电话号码的字母组合 - 力扣&#xff08;LeetCode&#xff09; class Solution {List<String> ans new LinkedList<>();StringBuilder temp new StringBuilder();public List<String> letterCombinations(String digits) {if(digitsnull || digits.leng…