【PyQt】(自定义类)QIcon派生,更易用的纯色Icon

news2025/1/17 14:06:42

嫌Qt自带的icon太丑,自己写了一个,主要用于纯色图标的自由改色。
当然,图标素材得网上找。



Qt原生图标与现代图标对比:

没有对比就没有伤害

Qt图标
Qt图标

网络素材图标
素材图标
请添加图片描述
请添加图片描述



自定义类XJQ_Icon:

from PyQt5.QtGui import QIcon,QPixmap,QImage

from cv2 import cv2
import numpy as np
from functools import reduce

__all__=['XJQ_Icon']
class XJQ_Icon(QIcon):
	def __init__(self,data,fg=(255,0,0,255),bg=(0,0,0,0)):#data可以为图片路径(str)或是图片数据(np.ndarray)
		# QIcon:https://doc.qt.io/qt-6/qicon.html
		super().__init__()
		if(isinstance(data,np.ndarray)):
			im=data
		elif(isinstance(data,str)):
			im=self.Opt_LoadPictAsArray(data)
		else:
			raise Exception('data参数错误,类型仅能为np.ndarray(图片数据)或是str(图片路径)')
		if(len(fg)==3):
			fg=(*fg,255)
		if(len(bg)==3):
			bg=(*bg,255)

		msk=cv2.split(im)[3]
		# msk=reduce(lambda a,b:a|b,cv2.split(im))#废弃,更多时候只需要关注alpha的值
		self.__msk=cv2.threshold(msk,127,255,cv2.THRESH_BINARY)[1]
		#cv2纯色图:https://blog.csdn.net/qq_45666248/article/details/107666586
		self.__bg=np.zeros((*msk.shape,4),np.uint8)
		self.__fg=np.zeros((*msk.shape,4),np.uint8)
		self.__bg[:] = bg
		self.__fg[:] = fg
		self.__UpdatePixmap()
	def Set_ForeColor(self,fg):
		if(len(fg)==3):
			fg=(*fg,255)
		self.__fg[:] = fg
		self.__UpdatePixmap()
	def Set_BackColor(self,bg):
		if(len(bg)==3):
			bg=(*bg,255)
		self.__bg[:] = bg
		self.__UpdatePixmap()
	def __UpdatePixmap(self):
		#模运算bitwise_and:https://blog.csdn.net/qq_40210586/article/details/106572504
		fg=self.__fg
		bg=self.__bg
		fg=cv2.bitwise_and(fg,fg, mask=self.__msk)
		bg=cv2.addWeighted(bg,1,fg,1,0)
		pix=self.Trans_ArrayToPixmap(bg)
		self.__pix=pix
		#虽然没有setPixmap但有这个addPixmap函数,简单看了下这个函数的功能,符合预期,很好
		#https://wenku.baidu.com/view/8d3284563269a45177232f60ddccda38376be1ba.html
		self.addPixmap(pix)
	@staticmethod
	def Opt_LoadPictAsArray(path):
		#cv2读取中文路径图片:https://www.zhihu.com/question/67157462/answer/251754530
		return cv2.imdecode(np.fromfile(path,dtype=np.uint8),cv2.IMREAD_UNCHANGED)
	@staticmethod
	def Trans_ArrayToPixmap(arr):#arr对应四通道图片。不使用PIL.Image模块
		#https://blog.csdn.net/comedate/article/details/121259033
		#https://blog.csdn.net/weixin_44431795/article/details/122016214
		img=QImage(arr.data, arr.shape[1], arr.shape[0], arr.shape[1]*4, QImage.Format_RGBA8888)
		return QPixmap(img)



示例代码+运行结果:

if __name__ == '__main__':
	import sys
	from PyQt5.QtWidgets import QWidget,QApplication,QPushButton,QLabel
	from PyQt5.QtCore import QSize

	app = QApplication(sys.argv)
	# icon=XJQ_Icon('返回.png')
	# icon=XJQ_Icon('三角形-002.png')
	icon=XJQ_Icon('比赛控制者.png')
	icon.Set_ForeColor((0,255,255,192))

	btn=QPushButton("ABC")
	btn.setIconSize(QSize(100,100))
	btn.setStyleSheet('font-size:50px;background:#FF8844')
	btn.setIcon(icon)
	btn.show()

	sys.exit(app.exec_())

运行结果



碎碎念:

  • 不得不说,与图片处理相关的复杂操作尽量别拉上Qt,会将操作复杂化的(而且往往得不到想要的效果)。像是在这篇帖子如何在 QPainter 中使用mask中,哪怕这么简单而又常见的场景,解决方案都那么抽象。
  • 图标素材请去网上获取,我看着爱给网提供的素材都还不错,虽然资源收费,但貌似没有很好的反爬防盗机制,图片很轻易就能保存下来(嘛如果真有防盗那直接去别的素材网就好了


参考:

  • 网络图标素材-爱给网:https://www.aigei.com/view/98465.html
  • QIcon类:https://doc.qt.io/qt-6/qicon.html
  • QIcon.addPixmap方法:https://wenku.baidu.com/view/8d3284563269a45177232f60ddccda38376be1ba.html
  • cv2无法读取中文路径的解决方法:https://www.zhihu.com/question/67157462/answer/251754530
  • 创建cv2纯色图:https://blog.csdn.net/qq_45666248/article/details/107666586
  • cv2掩模操作bitwise_and:https://blog.csdn.net/qq_40210586/article/details/106572504
  • cv2图片叠加addWeighted:https://blog.csdn.net/qq_29391809/article/details/117394512

未经本人同意不得私自转载。本文发布于CSDN:https://blog.csdn.net/weixin_44733774/article/details/135282787

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

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

相关文章

数字PID算法基础

数字PID是由编程语言实现的PID算法并烧录到控制芯片中,控制芯片与电机驱动连接,将PID控制算法的输出转换为PWM控制信号发送给电机驱动电路,电机驱动电路与直流电机相连并将PWM控制信号转换为具有相同占空比的PWM供电电压,通过对输…

MacBook查看本机IP

嘚吧嘚 其实这也不是什么困难的问题,但是今年刚刚入坑Mac,外加用的频率不是很高,每次使用的时候都查,用完就忘,下次用的时候再查🤮。真的把自己恶心坏了🙈。 所以写篇文章记录一下&#x1f92…

Linux:apache优化(4)—— 隐藏版本号

运行环境 yum -y install apr apr-devel cyrus-sasl-devel expat-devel libdb-devel openldap-devel apr-util-devel apr-util pcre-devel pcre gcc make zlib-devel 源码包配置 ./configure --prefix/usr/local/httpd --enable-cgi --enable-rewrite --enable-so --enabl…

MySQL数据库的安装与环境配置

下载 下载MySQL8 安装 解压 配置MySQL环境变量 系统环境变量path D:\ProgramFiles\mysql-8.0.20-winx64\bin 1.点击属性 2.点击高级系统设置 3.点击环境变量 4.在系统变量中找到path 注意这里不是用户变量 5.新建后输入解压的地址 MySQL初始化和启动 以管理员身份运行cmd…

macos下转换.dmg文件为 .iso .cdr文件的简单方法

为了让镜像文件在mac 和windows平台通用, 所以需要将.dmg格式的镜像文件转换为.iso文件, 转换方法也非常简单, 一行命令即可 hdiutil convert /path/to/example.dmg -format UDTO -o /path/to/example.iso 转换完成后的文件名称默认是 example.iso.cdr 这里直接将.cdr后缀删…

Efficient Classification of Very Large Images with Tiny Objects(CVPR2022补1)

文章目录 Two-stage Hierarchical Attention SamplingOne-stageTwo-Stage内存需求 Efficient Contrastive Learning with Attention Sampling Two-stage Hierarchical Attention Sampling 一阶段缩放是hw,提取的特征是h1w1, 二阶段缩放是uv(…

Vue中的默认插槽详解

Vue中的默认插槽详解 在 Vue 中,插槽(Slot)是一种非常强大且灵活的机制,用于在组件中插入内容。Vue 提供了两种类型的插槽:默认插槽(Default Slot)和具名插槽(Named Slot&#xff09…

24、Web攻防-通用漏洞SQL注入MYSQL跨库ACCESS偏移

文章目录 一、SQL注入原理   脚本代码在与数据库进行数据通讯时(从数据库取出相关数据进行页面显示),使用预定义的SQL查询语句进行数据查询。能通过参数传递自定义值来实现SQL语句的控制,执行恶意的查询操作,例如查询…

[Angular] 笔记 20:NgContent

chatgpt: 在Angular中&#xff0c;NgContent是用于内容投影&#xff08;Content Projection&#xff09;的一个重要概念。它允许你在一个组件中插入内容&#xff0c;并将这些内容投影到另一个组件中。 当你在一个组件中使用<ng-content></ng-content>标签时&…

Python新手教程 —— Hello, World!

文章目录 Hello, World!作者自述关于本系列什么是编程语言什么是Python安装Python运行Python3解释器IDLE编写代码文件 本文复习Python技术资源分享1、Python所有方向的学习路线2、学习软件3、入门学习视频4、实战案例5、清华编程大佬出品《漫画看学Python》6、Python副业兼职与…

黑马程序员SSM框架-Maven进阶

分模块开发与设计 分模块开发意义 分模块开发 依赖管理 依赖传递 依赖传递冲突问题 可以点击红框按钮查看依赖情况。 可选依赖和排除依赖 继承和聚合 聚合 聚合工程开发 继承 聚合和继承的区别 属性 属性的配置与使用 资源文件引用属性 其他属性&#xff08;了解&#xff0…

<JavaEE> 协议格式 -- 应用层协议 HTTP

目录 一、HTTP的概念 1&#xff09;什么是HTTP协议&#xff1f; 2&#xff09;什么是超文本&#xff1f; 二、HTTP协议格式 三、请求&#xff08;request&#xff09; 1&#xff09; 方法&#xff08;Method&#xff09; 1> GET方法 2> POST方法 3> GET和POS…

lv13 内核模块参数和依赖

1 模块传参 1.1 模块参数设置 将指定的全局变量设置成模块参数 module_param(name,type,perm);//将指定的全局变量设置成模块参数 /* name:全局变量名 type&#xff1a;使用符号 实际类型 传参方式bool bool insmod xxx.ko 变量名0 …

拍照就能建模!手机就能访问! 这个技术正成为宣传新手段!

随着人工智能技术的不断进步&#xff0c;现在可以通过拍摄照片结合AI技术来实现3D模型生成。这种技术的出现&#xff0c; 不仅能更加方便快捷地创建3D模型&#xff0c;而且还能真实复原现实中物件的质感、纹理等。同时&#xff0c;极大地降低了各行业对3D技术的应用门槛&#x…

[Angular] 笔记 24:ngContainer vs. ngTemplate vs. ngContent

请说明 Angular 中 ngContainer&#xff0c; ngTemplate 和 ngContent 这三者之间的区别。 chatgpt 回答&#xff1a; 这三个在 Angular 中的概念是关于处理和组织视图的。 1. ngContainer&#xff1a; ngContainer 是一个虚拟的 HTML 容器&#xff0c;它本身不会在最终渲染…

二分查找(非朴素)--在排序数组中查找元素的第一个和最后一个位置

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 本题链接 输入描述 输出描述 算法分析 1.算法一&#xff1a;暴力求解 2.算法二&#xff1a;朴素二分算法 3.算法三&#xff1a;二分查找左右端点 3.1查找左端点 3.1.1细节一&#xff1a;循环条件 3.1.2细节二…

【详解】KMP算法——每步配图让你打穿KMP

介绍 什么是KMP算法&#xff1a; KMP算法主要运用串的模式匹配中&#xff08;简单来说就是在s串中找到一个与t串相等的子串&#xff0c;称为模式匹配&#xff09;例如s为abcdef&#xff0c;t为bcd&#xff0c;那么就是在s中找到bcd&#xff0c;并返回其在s中的首下标&#xf…

【C++】STL 容器 - set 集合容器 ⑦ ( 查找元素 - set#find 函数 | 获取元素个数 - set#count 函数 )

文章目录 一、查找元素 - set#find 函数1、函数原型 简介2、代码示例 - set#find 函数 二、获取元素个数 - set#count 函数1、函数原型 简介2、代码示例 - set#find 函数 一、查找元素 - set#find 函数 1、函数原型 简介 在 C 语言的 STL 标准模板库 , std::set 集合容器 是一个…

优化模型:matlab二次规划

1.二次规划 1.1 二次规划的定义 若某非线性规划的目标函数为自变量 x x x的二次函数&#xff0c;且约束条件全是线性的&#xff0c;则称这种规划模型为二次规划。 1.2 二次规划的数学模型 min ⁡ 1 2 x T H x f T x \min \frac{1}{2}\boldsymbol{x}^{\boldsymbol{T}}\bolds…

Android实验:contentprovider 实验+SQLite 数据库的实现

目录 SQLite实验目的实验内容实验要求项目结构代码实现结果展示 SQLite SQLite 是一个开源的嵌入式关系数据库&#xff0c;实现了自给自足的、无服务器的、配置无需的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&#xff0c;这意味着与其他数据库系统不同&#xff0c;…