如何在pyqt中实现win10亚克力效果

亚克力效果的实现思路

上一篇博客《如何在pyqt中实现窗口磨砂效果》 中实现了win7中的Aero效果,但是和win10的亚克力效果相比,Aero还是差了点内味。所以今天早上又在网上搜了一圈,无意中发现了这篇博客《使用 SetWindowCompositionAttribute 来控制程序的窗口边框和背景》,点进去认真看了一遍之后深受启发,于是又去改了一下上次实现Aero效果时所用的函数,重新编译为dll给python调用,需要注意的是,要想成功使用编译好的dll必须在Visual Studio里面装好C++,如果不想装的话可以参见《如何在pyqt中通过调用SetWindowCompositionAttribute实现Win10亚克力效果》,这里面用纯Python的方法实现了亚克力效果。

具体实现流程

  1. WindowCompositionAttribute.h 的枚举类 ACCENT_STATE 中新增一个ACCENT_ENABLE_ACRYLICBLURBEHIND 参数,初值为4;
  2. 定义setBlur()函数的时候,ACCENT_POLICY accent = { ACCENT_ENABLE_ACRYLICBLURBEHIND, 0, gradientColor, 0 },和上次相比列表的第一个参数变成了 ACCENT_ENABLE_ACRYLICBLURBEHIND,第三个参数由0变为了gradientColor,这个参数用来设置窗口的背景色;
  3. 在VS2019里面把写好的函数编译为 acrylic.dll
  4. 在python中通过 hWnd=ctypes.wintypes.HWND(int(self.winId())),把WId类型强制转换为HWND类型,接着设置背景色 gradientColor = DWORD(0x50F2F2F2)0x50F2F2F2 的前两位是透明度,后面六位是bgr,最后 ctypes.cdll.LoadLibrary('acrylic_dll\\\acrylic.dll').setBlur(hWnd,gradientColor),实现动态链接库的载入和接口函数的调用,源代码如下:
import sys

from ctypes import cdll
from ctypes.wintypes import HWND, DWORD

from PyQt5.QtCore import Qt
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)

        # 调用api
        hWnd = HWND(int(self.winId()))      # 直接HWND(self.winId())会报错
        gradientColor = DWORD(0x50F2F2F2)   # 设置和亚克力效果相叠加的背景颜色
        cdll.LoadLibrary('acrylic_dll\\acrylic.dll').setBlur(hWnd, gradientColor)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

运行效果如下(硝子依旧如此美丽٩(๑>◡<๑)۶)

源代码以及dll

百度网盘(提取码:2la9):链接

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
好的,让我来回答你的问题。在PyQt,可以使用QPropertyAnimation类来实现上拉隐藏动画效果。具体实现方式如下: 1. 创建一个QWidget对象,作为要隐藏的控件。 2. 创建一个QPropertyAnimation对象,设置用于动画的属性名称(比如高度)以及动画的持续时间。 3. 实现一个槽函数,用于触发动画效果。在该槽函数,调用QPropertyAnimation对象的start()方法,让动画开始执行。 4. 在槽函数,使用QVariant对象来设置动画的起始值和结束值。比如,将控件的高度从当前值逐渐缩小到0,就可以实现上拉隐藏的效果。 下面是一个示例代码,用于实现一个按钮,点击时可以触发上拉隐藏动画效果: ```Python from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * class Widget(QWidget): def __init__(self, parent=None): super(Widget, self).__init__(parent) # 创建一个按钮 self.button = QPushButton('Click me') self.button.clicked.connect(self.animate) # 创建一个垂直布局,并将按钮添加到布局 layout = QVBoxLayout() layout.addWidget(self.button) self.setLayout(layout) # 设置控件的最小高度 self.setMinimumHeight(100) def animate(self): # 获取控件的当前高度 start_height = self.height() # 创建一个QPropertyAnimation对象,设置动画的目标和持续时间 animation = QPropertyAnimation(self, b'geometry', self) animation.setDuration(500) # 设置动画的起始值和结束值 start_geometry = QRect(0, 0, self.width(), start_height) end_geometry = QRect(0, 0, self.width(), 0) animation.setStartValue(start_geometry) animation.setEndValue(end_geometry) # 启动动画 animation.start() app = QApplication([]) widget = Widget() widget.show() app.exec_() ``` 希望这个答案能够帮助到你!
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值