QSplashScreen --软件启动前的交互

news2025/2/26 16:20:08

目录

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);
		//...
		
    }

使用效果

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

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

相关文章

「软件设计模式」责任链模式(Chain of Responsibility)

深入解析责任链模式&#xff1a;用C打造灵活的请求处理链 引言&#xff1a;当审批流程遇上设计模式 在软件系统中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个请求需要经过多个处理节点的判断&#xff0c;每个节点都有权决定是否处理或传递请求。就像企业的请假审批…

蓝桥杯嵌入式客观题以及解释

第十一届省赛&#xff08;大学组&#xff09; 1.稳压二极管时利用PN节的反向击穿特性制作而成 2.STM32嵌套向量终端控制器NVIC具有可编程的优先等级 16 个 3.一个功能简单但是需要频繁调用的函数&#xff0c;比较适用内联函数 4.模拟/数字转换器的分辨率可以通过输出二进制…

low rank decomposition如何用于矩阵的分解

1. 什么是矩阵分解和低秩分解 矩阵分解是将一个矩阵表示为若干结构更简单或具有特定性质的矩阵的组合或乘积的过程。低秩分解&#xff08;Low Rank Decomposition&#xff09;是其中一种方法&#xff0c;旨在将原矩阵近似为两个或多个秩较低的矩阵的乘积&#xff0c;从而降低复…

ubuntu离线安装Ollama并部署Llama3.1 70B INT4

文章目录 1.下载Ollama2. 下载安装Ollama的安装命令文件install.sh3.安装并验证Ollama4.下载所需要的大模型文件4.1 加载.GGUF文件&#xff08;推荐、更容易&#xff09;4.2 加载.Safetensors文件&#xff08;不建议使用&#xff09; 5.配置大模型文件 参考&#xff1a; 1、 如…

JNA基础使用,调用C++返回结构体

C端 test.h文件 #pragma oncestruct RespInfo {char* path;char* content;int statusCode; };extern "C" { DLL_EXPORT void readInfo(char* path, RespInfo* respInfo); }test.cpp文件 #include "test.h"void readInfo(char* path, RespInfo* respInfo…

解锁养生密码,拥抱健康生活

在快节奏的现代生活中&#xff0c;养生不再是一种选择&#xff0c;而是我们保持活力、提升生活质量的关键。它不是什么高深莫测的学问&#xff0c;而是一系列融入日常的简单习惯&#xff0c;每一个习惯都在为我们的健康加分。 早晨&#xff0c;当第一缕阳光洒进窗户&#xff0c…

OpenCV(6):图像边缘检测

图像边缘检测是计算机视觉和图像处理中的一项基本任务&#xff0c;它用于识别图像中亮度变化明显的区域&#xff0c;这些区域通常对应于物体的边界。是 OpenCV 中常用的边缘检测函数及其说明: 函数算法说明适用场景cv2.Canny()Canny 边缘检测多阶段算法&#xff0c;检测效果较…

spark的一些指令

一&#xff0c;复制和移动 1、复制文件 格式&#xff1a;cp 源文件 目标文件 示例&#xff1a;把file1.txt 复制一份得到file2.txt 。那么对应的命令就是&#xff1a;cp file1.txt file2.txt 2、复制目录 格式&#xff1a;cp -r 源文件 目标文件夹 示例&#xff1a;把目…

OpenHarmony全球化子系统

OpenHarmony全球化子系统 简介系统架构目录相关仓 简介 当OpenHarmony系统/应用在全球不同区域使用时&#xff0c;系统/应用需要满足不同市场用户关于语言、文化习俗的需求。全球化子系统提供支持多语言、多文化的能力&#xff0c;包括&#xff1a; 资源管理能力 根据设备类…

创建私人阿里云docker镜像仓库

步骤1、登录阿里云 阿里云创建私人镜像仓库地址&#xff1a;容器镜像服务 步骤2、创建个人实例 步骤&#xff1a;【实例列表】 》【创建个人实例】 》【设置Registry登录密码】 步骤3、创建命名空间 步骤&#xff1a;【个人实例】》【命名空间】》【创建命名空间】 注意&am…

【LLM】本地部署LLM大语言模型+可视化交互聊天,附常见本地部署硬件要求(以Ollama+OpenWebUI部署DeepSeekR1为例)

【LLM】本地部署LLM大语言模型可视化交互聊天&#xff0c;附常见本地部署硬件要求&#xff08;以OllamaOpenWebUI部署DeepSeekR1为例&#xff09; 文章目录 1、本地部署LLM&#xff08;以Ollama为例&#xff09;2、本地LLM交互界面&#xff08;以OpenWebUI为例&#xff09;3、本…

LLM之论文阅读——Context Size对RAG的影响

前言 RAG 系统已经在多个行业中得到广泛应用&#xff0c;尤其是在企业内部文档查询等场景中。尽管 RAG 系统的应用日益广泛&#xff0c;关于其最佳配置的研究却相对缺乏&#xff0c;特别是在上下文大小、基础 LLM 选择以及检索方法等方面。 论文原文: On the Influence of Co…

2025-02-25 学习记录--C/C++-用C语言实现删除字符串中的子串

用C语言实现删除字符串中的子串 在C语言中&#xff0c;你可以使用strstr函数来查找子串&#xff0c;然后用memmove或strcpy来覆盖或删除找到的子串。 一、举例 &#x1f430; #include <stdio.h> // 包含标准输入输出库&#xff0c;用于使用 printf 函数 #include <s…

【Linux】Ubuntu服务器的安装和配置管理

ℹ️大家好&#xff0c;我是练小杰&#xff0c;今天周二了&#xff0c;哪吒的票房已经到了138亿了&#xff0c;饺子导演好样的&#xff01;&#xff01;每个人的成功都不是必然的&#xff0c;坚信自己现在做的事是可以的&#xff01;&#xff01;&#x1f606; 本文是有关Ubunt…

2.3做logstash实验

收集apache日志输出到es 在真实服务器安装logstash&#xff0c;httpd systemctl start httpd echo 666 > /var/www/html/index.html cat /usr/local/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns/httpd #系统内置变量 cd /usr/local/…

pandas读取数据

pandas读取数据 导入需要的包 import pandas as pd import numpy as np import warnings import oswarnings.filterwarnings(ignore)读取纯文本文件 pd.read_csv 使用默认的标题行、逗号分隔符 import pandas as pd fpath "./datas/ml-latest-small/ratings.csv" 使…

ReentrantLock 用法与源码剖析笔记

&#x1f4d2; ReentrantLock 用法与源码剖析笔记 &#x1f680; 一、ReentrantLock 核心特性 &#x1f504; 可重入性&#xff1a;同一线程可重复获取锁&#xff08;最大递归次数为 Integer.MAX_VALUE&#xff09;&#x1f527; 公平性&#xff1a;支持公平锁&#xff08;按等…

java进阶专栏的学习指南

学习指南 java类和对象java内部类和常用类javaIO流 java类和对象 类和对象 java内部类和常用类 java内部类精讲Object类包装类的认识String类、BigDecimal类初探Date类、Calendar类、SimpleDateFormat类的认识java Random类、File类、System类初识 javaIO流 java IO流【…

架构思维:架构的演进之路

文章目录 引言为什么架构思维如此重要架构师的特点软件架构的知识体系如何提升架构思维大型互联网系统架构的演进之路一、大型互联网系统的特点二、系统处理能力提升的两种途径三、大型互联网系统架构演化过程四、总结 引言 在软件开发行业中&#xff0c;有很多技术人可能会问…

vue3:vue3项目安装并引入Element-plus

一、安装Element-plus 1、安装语句位置 安装 | Element Plushttps://element-plus.org/zh-CN/guide/installation.html根据所需进行安装&#xff0c;这里使用npm包 2、找到项目位置 找到项目位置&#xff0c;在路径上输入cmd回车打开“运行”窗口 输入安装语句回车完成安装 …