ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-04-11 15:02:54  阅读:267  来源: 互联网

标签:__ 窗口 python HWND self pyqt dll 磨砂


磨砂效果的实现思路

这两周一直在思考怎么在pyqt上实现窗口磨砂效果,网上搜了一圈,全都是Qt的实现方法,而且都是通过调用windows的api来实现磨砂效果的。本来想试试能不能照猫画虎,把C++给翻译成python,看了网上的代码发现C++的一些数据结构python没有(也有可能是自己太菜没发现),感觉直接翻译不太行。正好今天查python的官方文档的时候看到了ctypes里面的HWND,激动地连叫woc,既然来硬♂的不行,倒不如换一条思路:让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

标签:__,窗口,python,HWND,self,pyqt,dll,磨砂
来源: https://www.cnblogs.com/zhiyiYo/p/14643855.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有