【PyQt】(自定义类)阴影遮罩

写了一个感觉有些用的小玩具。
用于给控件添加阴影遮罩(强调主控件的同时屏蔽其余控件的点击)



自定义阴影遮罩Mask:

from PyQt5.QtCore import QPoint,QRect,Qt,QPoint,QSize
from PyQt5.QtWidgets import QWidget,QLabel,QPushButton,QVBoxLayout
from PyQt5.QtGui import QColor,QPainter,QBitmapclass Mask(QWidget):__exclude=None__color=Nonedef __init__(self,parent=None,*exclude,color=QColor(0,0,0,128)):super().__init__(parent)self.__exclude=set(exclude)self.__color=colorself.show()def paintEvent(self,event):self.resize(self.parent().size())bit=QBitmap(self.size())bit.fill(Qt.black)painter_bit=QPainter(bit)for wid,offset in self.__Get_Offset().items():painter_bit.eraseRect(QRect(offset,wid.size()))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 widget in self.__exclude:if(not widget.isVisible()):continuewid=widgetparent_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[widget]=offsetreturn record

测试代码+运行结果:

import sys
from PyQt5.QtWidgets import QApplication
if __name__=='__main__':app = QApplication(sys.argv)lb_1=QPushButton("ABCDE")lb_1.setStyleSheet("font-size:150px ; background-color:#FFFF00")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:#00FFFF")win=QWidget()vbox=QVBoxLayout(win)vbox.addWidget(lb_1)vbox.addStretch(1)vbox.addWidget(lb_2)win.show()win.resize(800,400)# msk=Mask(win,lb_1,color=QColor(0,0,0,192))# 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(lb_2,lb_1,lb_3,color=QColor(0,0,0,192))# msk.setParent(None)sys.exit(app.exec())

运行结果



说明:

  1. 即用即贴
  2. 这个Mask是个牛皮癣(因为设置了parent),执行语句msk.setParent(None)以删除遮罩
  3. 遮罩是规则的矩形。奇形怪状的需要自己额外修改代码实现


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

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

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

相关文章

leetcode:合并两个有序链表

题目描述 题目链接:21. 合并两个有序链表 - 力扣(LeetCode) 题目分析 这个算法思路很简单:就是直接找小尾插 定义一个tail和head,对比两个链表结点的val,小的尾插到tail->next,如果一个链表…

每日一题:LeetCode-589.N叉树的前序遍历序列构造二叉树

每日一题系列(day 01) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x1f50e…

企业微信身份验证

本篇主要是在上一篇获取第三方凭证基础上,用户通过三方网站自定义授权登录后获取用户信息,以实现用户绑定登录功能。 构造第三方应用授权链接 如果第三方应用需要在打开的网页里面携带用户的身份信息, 第一步需要构造如下的链接来获取授权c…

马养殖场建设VR模拟实训教学平台具有灵活性和复用性

为保障养殖场生物安全,避免疫病传播,学生出入养殖场受时间和地域的限制, 生产实习多以参观为主,通过畜牧企业技术人员的讲解,学生被动了解生产过程。为了解决畜牧养殖实训难的问题,借助VR技术开展畜牧养殖虚…

通过云服务器部署JavaWeb项目

文章目录 搭建Java运行环境部署项目更改部分项目代码打包项目把war包上传到webapps目录下验证程序 搭建Java运行环境 搭建环境的部分比较复杂,为了让大家的思路更加清晰特别总结为一篇博客点击查看 部署项目 更改部分项目代码 打包项目 把war包上传到webapps目录…

大洋钻探系列之三IODP 342航次是干什么的?(下)

上文简要地介绍IODP342航次的总体情况,本文以航次1个钻孔(U1403)为例,更为详细地系统展示大洋钻探航次的工作和成果。 ​编辑​ 站位叠加多波束影像的成果图见下图,从图中的颜色效果可以看出,此多波束的成…

归并排序算法

文章目录 归并排序一、归并排序思路二、归并排序算法模板三、题目代码 归并排序 一、归并排序思路 二、归并排序算法模板 void merge_sort(int q[], int l, int r) {if (l > r) return;int mid l r >> 1;//中间值merge_sort(q, l, mid);merge_sort(q, mid 1, r);…

大数据分析与应用实验任务九

大数据分析与应用实验任务九 实验目的 进一步熟悉pyspark程序运行方式; 熟练掌握pysaprkRDD基本操作相关的方法、函数,解决基本问题。 实验任务 进入pyspark实验环境,打开命令行窗口,输入pyspark,完成下列任务&am…

Redis入门教程

1. 什么是NoSql NoSQL一词最早出现于1998年,是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。2009年,Last.fm的Johan Oskarsson发起了一次关于分布式开源数据库的讨论,来自Rackspace的Eric Evans再次提出了NoSQL的概念&am…

onnx导出报错 | IndexError: index_select(): Index is supposed to be a vector

解决方案: 在torch.onnx.export钟添加do_constant_foldingFalse,如下 torch.onnx.export(model,(None, text),text_fp32_onnx_path,input_names[text],output_names[unnorm_text_features],export_paramsTrue,opset_version13,verboseTrue,do_constant_…

编程参考 - C++ Code Review: 一个计算器的项目

GitHub - jroelofs/calc: Toy Calculator Toy Calculator 1,拿到一个project,第一眼看,没有配置文件,说明没有引入持续集成系统,continuous integration system。 2,然后看cmake文件,使用的子…

使用Python的turtle模块绘制钢铁侠图案

1.1引言: 在Python中,turtle模块是一个非常有趣且强大的工具,它允许我们以一个可视化和互动的方式学习编程。在本博客中,我们将使用turtle模块来绘制钢铁侠的图案。通过调用各种命令,我们可以引导turtle绘制出指定的图…

第十四章 控制值的转换 - 在DISPLAYLIST中投影值

文章目录 第十四章 控制值的转换 - 在DISPLAYLIST中投影值在DISPLAYLIST中投影值 第十四章 控制值的转换 - 在DISPLAYLIST中投影值 在DISPLAYLIST中投影值 对于 %String 类型(或任何子类)的属性,XML 投影可以使用 DISPLAYLIST 参数。 简单…

CrystalDiskInfo/CrystalDiskMark/DiskGenius系统迁移

CrystalDiskInfo 主要用于看硬盘的各种信息,包括但不限于硬盘通电时间、通电次数、硬盘好坏状态 CrystalDiskMark 主要用于测试硬盘的读写速度、连续读写速度 DiskGenius 主要用于通过U盘装操作系统后进行,磁盘分区,更改磁盘名、隐藏部分…

【前端知识】Node——http模块url模块的常用操作

一、创建简易Server const http require(http); const URL require(url);const HTTP_PORT 8088;const server http.createServer((req, res) > {// req:request请求对象,包含请求相关的信息;// res:response响应对象&…

【MISRA C 2012】Rule 5.2 在同一作用域和名称空间中声明的标识符应该是不同的

1. 规则1.1 原文1.2 分类 2. 关键描述3. 代码实例 1. 规则 1.1 原文 Rule 5.2 Identifiers declared in the same scope and name space shall be distinct Category Required Analysis Decidable, Single Translation Unit Applies to C90, C99 1.2 分类 规则4.2&#xff…

案例014:Java+SSM+uniapp+mysql基于微信小程序的健身管理系统

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

【机器学习 | ARIMA】经典时间序列模型ARIMA定阶最佳实践,确定不来看看?

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

SpringBoot:ch02 配置文件(日志)

前言 简单介绍 Spring Boot 中常见的配置文件类型&#xff0c;如 application.properties 和 application.yml 等&#xff0c;并说明它们各自的特点和用途。 一、前期准备 1、新建项目&#xff0c;结构如下 2、添加依赖 <?xml version"1.0" encoding"UTF…