【PyQt】(自定义类)阴影遮罩-升级版

这是之前发的代码(自定义类)阴影遮罩的升级版。
升级就升级在,优化了对非矩形控件的遮盖效果,例如圆角按钮,以及默认方法不满足时可以传入其他的遮盖方法。



自定义阴影遮罩Mask:

class Mask(QWidget):__exclude=None__color=Noneclicked=pyqtSignal(object)#单击遮罩时触发,以实现其他操作def __init__(self,parent=None,*exclude,color=QColor(0,0,0,128)):super().__init__(parent)exclude=list(exclude)for pst in range(len(exclude)):if(type(exclude[pst])!=tuple):exclude[pst]=(exclude[pst],self.Trans_WidMask_Default)else:if(len(exclude[pst])<2):exclude[pst]=(exclude[pst][0],self.Trans_WidMask_Default)elif(type(exclude[pst][1])==bool):if(exclude[pst][1]==False):exclude[pst]=(exclude[pst][0],self.Trans_WidMask_Default)else:exclude[pst]=(exclude[pst][0],self.Trans_WidMask_Style)self.__exclude=excludeself.__color=colorself.show()self.__wid=QWidget()def mousePressEvent(self,event):self.clicked.emit(self)def paintEvent(self,event):self.resize(self.parent().size())bit=QBitmap(self.size())bit.fill(Qt.black)painter_bit=QPainter(bit)for item,offset in self.__Get_Offset().items():wid,trans=itempix=trans(wid)# pix=self.Trans_WidMask_Default(wid)# pix=self.Trans_WidMask_Style(wid)painter_bit.drawPixmap(QRect(offset,wid.size()),pix)painter_bit.end()painter_self=QPainter(self)painter_self.fillRect(0,0,self.size().width(),self.size().height(),self.__color)painter_self.end()self.setMask(bit)def __Get_Offset(self):record={}parent_self=self.parent()for item in self.__exclude:if(not item[0].isVisible()):continuewid=item[0]parent_wid=wid.parent()offset=QPoint(0,0)while (True):offset+=wid.pos()if(not parent_wid):breakif(parent_wid==parent_self):breakwid=wid.parent()parent_wid=wid.parent()if(parent_wid):record[item]=offsetreturn record@classmethoddef Trans_WidMask_Default(self,wid):pix=QPixmap(wid.size())pix.fill(Qt.white)return pix@classmethoddef Trans_WidMask_Style(self,wid):arr=self.Trans_PixToArray(wid.grab())#洪填,将外围填充arr=cv2.cvtColor(arr,cv2.COLOR_RGBA2GRAY)h, w = arr.shape[:2]mask = np.zeros([h+2, w+2],np.uint8)arr_copy=arr.copy()arr=cv2.rectangle(arr,(0,0),(w-1,h-1),(int(arr[0][0]),))cv2.floodFill(arr, mask, (0,0), (0,), (2,), (2,), cv2.FLOODFILL_FIXED_RANGE)#参数是试出来的...懒得研究洪填arr=arr==arr_copyarr=arr*255arr=arr.astype(np.uint8)return self.Trans_ArrayToPix(arr)@staticmethoddef Trans_PixToArray(pix):#pix是RGBA四通道QPixmap。不使用PIL.Image模块h,w=pix.height(),pix.width()buffer = QImage(pix).constBits()buffer.setsize(h*w*4)arr = np.frombuffer(buffer, dtype=np.uint8).reshape((h,w,4))return arr.copy()@staticmethoddef Trans_ArrayToPix(arr):#arr对应四通道图片。不使用PIL.Image模块arr=cv2.cvtColor(arr,cv2.COLOR_RGBA2BGRA)img=QImage(arr.data, arr.shape[1], arr.shape[0], arr.shape[1]*4, QImage.Format_RGBA8888)return QPixmap(img)

测试代码+运行结果:


if __name__=='__main__':import sysfrom PyQt5.QtWidgets import QApplicationapp = QApplication(sys.argv)lb_1=QPushButton("ABCDE")lb_1.setStyleSheet("font-size:150px ; border:2px groove gray;border-radius:50px;padding:2px 4px;border-style: outset;}""QPushButton{background-color: rgb(0, 224, 224);}""QPushButton:hover{background-color:rgb(0, 255, 255); color: black;}""QPushButton:pressed{background-color:rgb(0, 192, 192);border-style: inset;")lb_2=QPushButton("PQRST")lb_2.setStyleSheet("font-size:150px ; background-color:#FF0000")lb_3=QPushButton("XYZ",lb_2)lb_3.setStyleSheet("font-size:50px ; background-color:#FFFF00")win=QWidget()vbox=QVBoxLayout(win)vbox.addWidget(lb_1)vbox.addStretch(1)vbox.addWidget(lb_2)win.show()win.resize(755,400)#【创建阴影遮罩】# msk=Mask(win,lb_1,lb_2,color=QColor(0,0,0,192))# msk=Mask(win,lb_1,lb_3,color=QColor(0,0,0,192))msk=Mask(win,(lb_1,True),lb_3,color=QColor(0,0,0,192))# msk.setParent(None)msk.clicked.connect(lambda msk:msk.hide())#单击隐藏遮罩sys.exit(app.exec())

运行结果

说明:

  1. 与前篇文章(自定义类)阴影遮罩的用法大致一致,是“即用即贴”型,不用时就调用msk.setParent(None)撤走即可。
  2. 简单说明Mask的构造函数Mask(parent=None,*exclude,color=QColor(0,0,0,128))
    exclude元素可以有4种样式:wid、(wid,False)、(wid,True)、(wid,Func),其中wid等价于(wid,False)。
    exclude元素的第二参数如果为False那么将对应调用Mask.Trans_WidMask_Default[普通型],为True将调用Mask.Trans_WidMask_Style[样式表型],当这两种方法都不能满足遮盖需求时,即可自己编写第三种方法并将第二参数设置为该函数。
    上面的说明看不懂没关系,试着运行下测试代码就知道了。
  3. 遮罩单击时会触发clicked信号,用于实现“点击空白位置以取消”的操作。(感觉还不够用的话就自己改Mask代码吧


参考:

  • (自定义类)阴影遮罩:https://blog.csdn.net/weixin_44733774/article/details/134587980
  • QPixmap与numpy.array互转:https://blog.csdn.net/weixin_44733774/article/details/134578487
  • OpenCV中floodfill的使用(洪水填充):https://blog.csdn.net/remakeprogramer/article/details/113724635

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

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

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

相关文章

20 章 多线程

20.1线程简介. 20.2创建线程 2.1继承Thread类 Thread 类是java.lang包中的一个类&#xff0c;从这个类中实例化的对象代表线程&#xff0c;程序员启动一个新线程需要建立Thread 实例。Thread类中常用的两个构造方法如下: public Thread():创建一个新的线程对象。 public Thre…

数据安全:专业服务与您共同对抗.faust数字勒索的威胁

引言&#xff1a; 在数字世界的幕后&#xff0c;一股黑暗势力悄然崛起。.faust勒索病毒&#xff0c;如同数码时代的黑手党&#xff0c;通过其高度精密的加密技术&#xff0c;正在肆虐用户和组织的数据。本文将深入挖掘.faust的狡猾手法&#xff0c;为您揭示其隐藏在数字背后的…

v-model(双向数据绑定)自动收集数据

v-model 是 Vue 中一个常用的指令&#xff0c;用于实现表单元素与数据的双向绑定。 它的实现原理主要基于以下两个方面&#xff1a; 语法实现&#xff1a; v-model 实际上是 Vue 对 :value 和 input 两个属性的语法糖。当我们在组件中使用 v-model 指令时&#xff0c;Vue 会根…

C++ string类(二)

insert&#xff1a; erase&#xff1a; 常见用法&#xff1a; int main() {string s1("hello world");string s2("gm");s1.insert(5,"x");cout << s1 << endl;s1.insert(6,s1,0);cout << s1 << endl;s1.insert(0,&qu…

HTML中input标签的23种type类型

一、概述 随着html5的出现&#xff0c;input标签新增了多种类型&#xff0c;用以接收各种类型的用户输入。其中传统输入控件有10种&#xff0c;新增输入控件有13种。 二、传统类型 传统输入控件有10种&#xff0c;如下所示 text 定义单行文本输入框 password 定义…

Matlab 点云曲率计算(之二)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 之前已经讨论过许多关于计算曲率的问题,这里使用一个通过拟合三次曲面方程的方式来计算曲率,计算过程如下图所示: 二、实现代码 %********

goweb入门教程

本文是作者自己学习goweb时写的笔记&#xff0c;分享给大家&#xff0c;希望能有些帮助 前言&#xff1a; 关于web&#xff1a;本质 ​ ​ web中最重要的就是浏览器和服务器的request(请求)和response(响应)&#xff1b; ​ 一个请求对应一个响应。 一个请求对应一个响应&…

11-28渗透

用nmap扫描靶机1进行主机发现 已知靶机1的主机在172.16.17.0/24下 扫描结果如下 根据扫描结果看开启的服务怀疑172.16.17.177是靶机1 浏览器访问172.16.17.177页面得到如下 我们知道织梦cms系统默认管理路径是dede&#xff0c;登陆管理后台可以通过地址172.16.17.177/dede/i…

map 和 flatMap 的区别

StreamAPI 中的 map 方法&#xff0c;实现是一种映射关系。类似数学中的 x -> f(x)。 而 flatMap 方法是在 map 的基础上做了一次 flat。 相信看了下面的例子大家会有更加直观的理解&#xff1a; public static void main(String[] args) {List<Integer> list1 Ar…

python爬虫防乱码方案

python爬虫防乱码方案 一、chardet库 ​ 自动检测编码&#xff1a;使用 Python 库 chardet 可以自动检测文本的编码&#xff0c;然后使用检测到的编码来解码文本。你可以尝试使用 chardet 库来检测编码&#xff0c;然后解码网页内容。 案例 import requests import chardet…

运算符展开、函数,对象,数组,字符串变化 集合

... 展开运算符 用于函数实参或者赋值号右边 console.log(...[1, 2, 3]) // 1,2,3console.log(Math.max(...[1, 2, 3]))//3 console.log(Math.max.apply(null, [1, 2, 3]))//3const o { a: 1, b: 2 }const obj { ...o, c: 3 }console.log(obj)//Object ... 剩余运算符 用于…

11月28日配置环境中的错误

1.pycharm中的anaconda环境 pycharm中出现Conda executable is not found 2.使用GPU进行训练时&#xff0c;dataloader的numwork2是在linux环境下进行子线程调用&#xff0c;但在windows中是只能单线程&#xff0c;所以num_work 0 才不报错。

隐式类型转化

1. 2. 3. 4. 5. 6. 7. 8.

Flutter开发type ‘Future<int>‘ is not a subtype of type ‘int‘ in type cast错误

文章目录 问题描述错误源码 问题分析解决方法修改后的代码 问题描述 今天有个同事调试flutter程序时报错&#xff0c;问我怎么解决&#xff0c;程序运行时报如下错误&#xff1a; type ‘Future’ is not a subtype of type ‘int’ in type cast 错误源码 int order Databas…

PTA-6-48 使用面向对象的思想编写程序描述动物

题目&#xff1a; 使用面向对象的思想编写程序描述动物&#xff0c;说明&#xff1a; &#xff08;1) 分析兔子和青蛙的共性&#xff0c;定义抽象的动物类&#xff0c;拥有一些动物共有的属性&#xff1a;名字、颜色、类别&#xff08;哺乳类、非哺乳类&#xff09;&#xff0c…

ES8语法async与await

async和await两种语法结合可以让异步代码像同步代码一样。 一、async函数 async函数的返回值为Promise对象promise对象的结果由async函数执行的返回值决定 async function fn() {// 返回一个字符串return 字符串&#xff1b;// 返回的结果不是一个Promise类型的对象&#xf…

气体电介质击穿机理及其模拟

摘 要 气体介质在电场作用下发生碰撞电离而导致电极间贯穿性放电的现象。气体介质击穿与很多因素有关&#xff0c;其中主要的影响因素为作用电压、电极形状、气体的性质及状态等。气体介质击穿常见的有直流电压击穿、工频电压击穿、冲击电压击穿、高气压电击穿、高真空电击穿、…

20分钟拥有自己的ChatGPT4,高效低成本,小白必看

准备工作 1、准备一个3.5的账号 2、一张虚拟卡 开始步骤 从ChatGPT第一版发布到现在&#xff0c;还不到一年的时间中&#xff0c;可是它使用的GPT架构已经从3.5版本进化到现在的4.0版本&#xff0c;随之而来的是其能力的极大提升。下面是GPT-4在其官网的介绍中的一句话&…

NetCDF开发( C++) [Window32位+ VS2013]

NetCDF开发( C) [Window32位 VS2013] 记录在windows32位平台开发netcdf数据配置过程。 1、在netcdf网站(netCDF Downloads)下载相关的库&#xff0c;这里需要下载netCDF4.9.2-NC4-32.exe、netcdf-cxx4-4.3.1.zip。 2、安装netCDF4.9.2-NC4-32.exe到D盘根目录。 3、解压netcdf-c…

conda环境下 ERROR: CMake must be installed to build dlib问题解决

1 问题描述 pip install -r requirements.txt 在构建video_retalking项目过程中&#xff0c;使用命令安装依赖包时&#xff0c;出现如下错误&#xff1a; Building wheels for collected packages: face-alignment, dlib, ffmpy, futureBuilding wheel for face-alignment …