如何在pyqt中实现窗口磨砂效果
磨砂效果的实现思路
这两周一直在思考怎么在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_())
运行效果如下图所示(硝子真美(~ ̄▽ ̄)~

源代码和dll
百度网盘(提取码:7o6r): link
如何在pyqt中实现窗口磨砂效果的更多相关文章
- 如何在pyqt中实现亚克力磨砂效果的QLabel
前言 Windows10 在 UWP 应用中支持亚克力画刷,可以在部件的底部绘制亚克力效果的背景图.下面我们使用 QLabel 来模拟这个磨砂过程. 实现方法 MSDN 文档中介绍了亚克力材料的配方, ...
- 如何在pyqt中实现win10亚克力效果
亚克力效果的实现思路 上一篇博客<如何在pyqt中实现窗口磨砂效果> 中实现了win7中的Aero效果,但是和win10的亚克力效果相比,Aero还是差了点内味.所以今天早上又在网上搜了一 ...
- 如何在pyqt中自定义无边框窗口
前言 之前写过很多关于无边框窗口并给窗口添加特效的博客,按照时间线罗列如下: 如何在pyqt中实现窗口磨砂效果 如何在pyqt中实现win10亚克力效果 如何在pyqt中通过调用SetWindowCo ...
- 如何在pyqt中通过调用 SetWindowCompositionAttribute 实现Win10亚克力效果
亚克力效果 在<如何在pyqt中实现窗口磨砂效果>和<如何在pyqt中实现win10亚克力效果>中,我们调用C++ dll来实现窗口效果,这种方法要求电脑上必须装有MSVC.V ...
- 如何在pyqt中实现带动画的动态QMenu
弹出菜单的视觉效果 QLineEdit 原生的菜单弹出效果十分生硬,而且样式很丑.所以照着Groove中单行输入框弹出菜单的样式和动画效果写了一个可以实现动态变化Item的弹出菜单,根据剪贴板的内容是 ...
- 如何在pyqt中在实现无边框窗口的同时保留Windows窗口动画效果(一)
无边框窗体的实现思路 在pyqt中只要 self.setWindowFlags(Qt.FramelessWindowHint) 就可以实现边框的去除,但是没了标题栏也意味着窗口大小无法改变.窗口无法拖 ...
- 如何在pyqt中给无边框窗口添加DWM环绕阴影
前言 在之前的博客<如何在pyqt中通过调用SetWindowCompositionAttribute实现Win10亚克力效果>中,我们实现了窗口的亚克力效果,同时也用SetWindowC ...
- 如何在 pyqt 中捕获并处理 Alt+F4 快捷键
前言 如果在 Windows 系统的任意一个窗口中按下 Alt+F4,默认行为是关闭窗口(或者最小化到托盘).对于使用了亚克力效果的窗口,使用 Alt+F4 最小化到托盘,再次弹出窗口的时候可能出现亚 ...
- 如何在pyqt中使用 QGraphicsView 实现图片查看器
前言 在 PyQt 中可以使用很多方式实现照片查看器,最朴素的做法就是重写 QWidget 的 paintEvent().mouseMoveEvent 等事件,但是如果要在图像上多添加一些形状,那么在 ...
随机推荐
- Elasticsearch核心技术(五):搜索API和搜索运行机制
本文将从数据存储和搜索的角度简单分析Elasticsearch的搜索运行机制,主要涉及搜索API.搜索机制.存在问题和解决方案. 4.1 Search API Search API允许用户执行一个搜索 ...
- 【操作系统】Linux bash常用函数路径配置
临时方法:export PATH=/usr/bin:/usr/sbin:/bin:/sbin长期方法:1. vi /etc/profile2. 在最后插入并保存: export PA ...
- Feign动态调用,结合Ribbon
代码如下,三种方法: import org.springframework.beans.factory.annotation.Autowired;import org.springframework. ...
- Android物联网应用程序开发(智慧城市)—— 购物信息的存储界面开发
效果: 布局代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...
- Sentry 企业级数据安全解决方案 - Relay 运行模式
内容整理自官方开发文档 Relay 可以在几种主要模式之一下运行,如果您正在配置 Relay server 而不是使用默认设置,那么事先了解这些模式至关重要. 模式存储在配置文件中,该文件包含 rel ...
- 了解C#的协变和逆变
前言 在引用类型系统时,协变.逆变和不变性具有如下定义. 这些示例假定一个名为 Base 的基类和一个名为 Derived的派生类. Covariance 使你能够使用比原始指定的类型派生程度更大的类 ...
- maven pom.xml 的 spring-boot-maven-plugin 红色报错 解决
解决方法,添加对应的spring boot 版本号即可
- BeanUtils.copyProperties 选择性赋值字段
BeanUtils.copyProperties 在字段赋值上有强大的功能,如果有两个的类,如果需要将相同的字段赋值,就可以直接赋制.而不需要每个字段都需要一个一个赋制. BeanUtils.copy ...
- 【Spring专场】「MVC容器」不看源码就带你认识核心流程以及运作原理
前提回顾 之前已经写了很多问斩针对于SpringMVC的的执行原理和核心流程,在此再进行冗余介绍就没有任何意义了,所以我们主要考虑的就是针对于SpringMVC还没但大框架有介绍的相关内容解析分析和说 ...
- test_1 计算字符串最后一个单词的长度,单词以空格隔开
题目描述:计算字符串最后一个单词的长度,单词以空格隔开. 输入描述: 一行字符串,非空,长度小于5000. 输出描述: 整数N,最后一个单词的长度. #coding=utf-8 str = raw_ ...