如何在pyqt中实现窗口磨砂效果

如何在pyqt中实现窗口磨砂效果

磨砂效果的实现思路

这两周一直在思考怎么在pyqt上实现窗口磨砂效果,网上搜了一圈,全都是 C++ 的实现方法。正好今天查python的官方文档的时候看到了 ctypes 里面的 HWND,想想倒不如换一条思路:让 C++ 帮我做磨砂的事情,而我只需要在python中调用 dll 中的接口函数就行了。需要注意的是,要想成功调用这个dll必须安好MSVC,不想安的话可以参见《如何在pyqt中通过调用SetWindowCompositionAttribute实现Win10亚克力效果》,这里面用纯python的方式实现了窗口磨砂效果。

具体实现流程

  1. 先写一个实现磨砂效果的C++函数setBlur(),调用的时候只需往这个函数传递窗口句柄就行了;

  2. 在VS2019里面把写好的函数编译为aeroDll.dll

  3. 在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_())

运行效果如下图所示(硝子真美(~ ̄▽ ̄)~

源代码和dll

百度网盘(提取码:7o6r): link

头像
posted @   之一Yo  阅读(1677)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示