如何在pyqt中实现窗口磨砂效果
2023-02-18 16:32:01 时间
磨砂效果的实现思路
这两周一直在思考怎么在pyqt上实现窗口磨砂效果,网上搜了一圈,全都是 C++ 的实现方法。正好今天查python的官方文档的时候看到了 ctypes
里面的 HWND
,想想倒不如换一条思路:让 C++ 帮我做磨砂的事情,而我只需要在python中调用 dll 中的接口函数就行了。需要注意的是,要想成功调用这个dll必须安好MSVC,不想安的话可以参见《如何在pyqt中通过调用SetWindowCompositionAttribute实现Win10亚克力效果》,这里面用纯python的方式实现了窗口磨砂效果。
具体实现流程
-
先写一个实现磨砂效果的C++函数
setBlur()
,调用的时候只需往这个函数传递窗口句柄就行了; -
在VS2019里面把写好的函数编译为aeroDll.dll;
-
在python通过
hWnd=ctypes.wintypes.HWND(int(self.winId()))
;把WId类型强制转换为HWND
类型,接着只需ctypes.cdll.LoadLibrary('Aero\\\aeroDll.dll').setBlur(hWnd)
,就能实现动态链接库的载入和接口函数的调用,源代码如下:
import sys
from ctypes import cdll
from ctypes.wintypes import HWND
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QColor, QPainter
from PyQt5.QtWidgets import QApplication, QWidget
class Demo(QWidget):
""" 磨砂效果的实现 """
def __init__(self):
super().__init__()
self.resize(500, 500)
# 去除边框
self.setWindowFlags(Qt.FramelessWindowHint)
# 背景透明
self.setAttribute(Qt.WA_TranslucentBackground)
# 设置背景色
self.bgColor = QColor(255,50,50,80) # 可以根据个人需要调节透明度
# 调用api
hWnd = HWND(int(self.winId())) # 直接HWND(self.winId())会报错
cdll.LoadLibrary('Aero\\aeroDll.dll').setBlur(hWnd) # dll和脚本放在同一个目录下会报错找不到dll
def paintEvent(self, e):
""" 绘制背景 """
painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing)
painter.setPen(Qt.NoPen)
painter.setBrush(self.bgColor)
painter.drawRoundedRect(self.rect(), 20, 20)
if __name__ == "__main__":
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
运行效果如下图所示(硝子真美(~ ̄▽ ̄)~
![](https://img-blog.csdnimg.cn/20200614054345154.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poaXlpWW8=,size_16,color_FFFFFF,t_70)
源代码和dll
百度网盘(提取码:7o6r): link
相关文章
- React技巧之组件中返回多个元素
- 火热的低代码到底是什么?
- 参加NextArch主办的「低代码meetup」
- 资深架构师开始录播了一起聊聊微服务、容器化、低代码及架构设计
- 消息队列(mq)是什么?
- 如何避免重复的开发
- 用BPM解决企业信息化的数据孤岛
- 撸代码之前我们应该想些什么
- 从开发的角度去分解项目需求
- 解决Docker安装Redis不能远程链接的问题
- 批量转移MySql数据表及附带脚本
- SaaS化工作流引擎设计方案
- 微服务&spring cloud架构系列
- 基础架构系列
- Docker Swarm 常用命令
- 5大数据库种类,如果你全部在实际项目中用过,绝对是大神!
- 服务调用链的主要因素和简要对比
- 50+ Useful Docker Tools
- docker pull提示x509错误的对应方法
- 一键清理 Nexus 中无用的 Docker 镜像