如何在 pyqt 中捕获并处理 Alt+F4 快捷键
前言
如果在 Windows 系统的任意一个窗口中按下 Alt+F4,默认行为是关闭窗口(或者最小化到托盘)。对于使用了亚克力效果的窗口,使用 Alt+F4 最小化到托盘,再次弹出窗口的时候可能出现亚克力背景和窗口阴影失效的问题,如下图所示:

所以本篇博客将会介绍在 PyQt 中捕获并处理 Alt+F4 的方法,亚克力无边框窗口的实现方法参见 《如何在 pyqt 中自定义无边框窗口》,下面进入正题。
实现过程
对于快捷键处理,第一反应是重写 keyPressEvent() ,但是对于 Alt+F4 这种系统级别的快捷键此非法是无法捕获的,重写 nativeEvent 才是正解。按下 Alt+F4 之后,窗口就能收到 WM_SYSKEYDOWN 消息,同时消息的 wParam 等于 VK_F,这时候手动可以给窗口发送一个 QCloseEvent,然后在关闭事件中进行处理。
class Window(QWidget):
def __init__(self, parent=None):
super().__init__(parent=parent)
self.__closeByKey = False
def nativeEvent(self, eventType, message):
""" Handle the Windows message """
msg = MSG.from_address(message.__int__())
if msg.message == win32con.WM_SYSKEYDOWN:
if msg.wParam == win32con.VK_F4:
self.__closeByKey = True
QApplication.sendEvent(self, QCloseEvent())
return False, 0
return super().nativeEvent(eventType, message)
def closeEvent(self, e):
quitOnClose = QApplication.quitOnLastWindowClosed()
if not self.__closeByKey or quitOnClose:
self.__closeByKey = False
return super().closeEvent(e)
# 最小化到托盘
self.__closeByKey = False
self.hide()
再次测试,发现原本黑色背景的问题已经被成功解决了(软件的实现代码参见 Groove):

如何在 pyqt 中捕获并处理 Alt+F4 快捷键的更多相关文章
- 如何在pyqt中自定义无边框窗口
前言 之前写过很多关于无边框窗口并给窗口添加特效的博客,按照时间线罗列如下: 如何在pyqt中实现窗口磨砂效果 如何在pyqt中实现win10亚克力效果 如何在pyqt中通过调用SetWindowCo ...
- 如何在pyqt中实现窗口磨砂效果
磨砂效果的实现思路 这两周一直在思考怎么在pyqt上实现窗口磨砂效果,网上搜了一圈,全都是 C++ 的实现方法.正好今天查python的官方文档的时候看到了 ctypes 里面的 HWND,想想倒不如 ...
- 如何在pyqt中实现win10亚克力效果
亚克力效果的实现思路 上一篇博客<如何在pyqt中实现窗口磨砂效果> 中实现了win7中的Aero效果,但是和win10的亚克力效果相比,Aero还是差了点内味.所以今天早上又在网上搜了一 ...
- 如何在pyqt中通过调用 SetWindowCompositionAttribute 实现Win10亚克力效果
亚克力效果 在<如何在pyqt中实现窗口磨砂效果>和<如何在pyqt中实现win10亚克力效果>中,我们调用C++ dll来实现窗口效果,这种方法要求电脑上必须装有MSVC.V ...
- 如何在pyqt中在实现无边框窗口的同时保留Windows窗口动画效果(一)
无边框窗体的实现思路 在pyqt中只要 self.setWindowFlags(Qt.FramelessWindowHint) 就可以实现边框的去除,但是没了标题栏也意味着窗口大小无法改变.窗口无法拖 ...
- 如何在pyqt中给无边框窗口添加DWM环绕阴影
前言 在之前的博客<如何在pyqt中通过调用SetWindowCompositionAttribute实现Win10亚克力效果>中,我们实现了窗口的亚克力效果,同时也用SetWindowC ...
- 如何在pyqt中实现带动画的动态QMenu
弹出菜单的视觉效果 QLineEdit 原生的菜单弹出效果十分生硬,而且样式很丑.所以照着Groove中单行输入框弹出菜单的样式和动画效果写了一个可以实现动态变化Item的弹出菜单,根据剪贴板的内容是 ...
- PyQt学习随笔:PyQt中捕获键盘事件后获取具体按键值的方法
在PyQt中,如果要捕获键盘事件的具体按键,可以通过重写组件对象的keyPressEvent方法或event方法来捕获具体的按键,推荐使用keyPressEvent方法,因为event方法是一个通用事 ...
- 如何在pyqt中使用 QGraphicsView 实现图片查看器
前言 在 PyQt 中可以使用很多方式实现照片查看器,最朴素的做法就是重写 QWidget 的 paintEvent().mouseMoveEvent 等事件,但是如果要在图像上多添加一些形状,那么在 ...
随机推荐
- ccf颁奖晚会
感想: 首先,十分感谢学校给我们参加比赛的机会,给予我们这次难能可贵的学习机会,第一次在这么大型的赛场中展现自己,我们也不免有些紧张.从最开始在线上进行模型训练,到我们不远千里在江苏进行场地的勘察,到 ...
- uniapp最简单的上拉加载更多demo
data() { return { list:[],//数据列表 page: 1,//页数 } }, //请求一下数据(进入页面请求一次) onLoad() { this.getnewsList(th ...
- BootstrapBlazor-ValidateForm 表单验证组件
原文链接:https://www.cnblogs.com/ysmc/p/16082279.html 故名思意,这个组件的作用我就不再多说了,配合 AutoGenerateColumnAttribute ...
- 设计模式之:享元模式FlyweightPattern的实现
享元模式的理解: 享元模式的定义:运用共享技术支持大量细粒度对象的复用: Flyweight Pattern Definition:Use sharing to support large numbe ...
- springboot集成spring security实现登录和注销
文章目录 一.导入坐标 二.Users实体类及其数据库表的创建 三.controller,service,mapper层的实现 四.核心–编写配置文件 五.页面的实现 运行结果 一.导入坐标 < ...
- 1、【Python运维脚本】Python 按时间删除和清空文件
删除和清空文件,用shell的话一条命令就够了,Python要一堆命令. 但是为了学习Python,所以用于实战,就得这么干了. Python 按时间删除和清空文件 #!/usr/bin/python ...
- 安卓记账本开发学习day7之完成进度
支持长按删除记录,与根据备注搜索相关的收入或支出情况
- el-carousel手动切换图片
添加ref 和 点击哪个地方切换的方法 <div class="center"> <div class="pw between"& ...
- Dapr 能否取代 Spring Cloud?
很多人都是使用SpringBoot 和 Spring Cloud来开发微服务.Dapr 也是开发微服务的框架,它和Spring Cloud有什么区别呢,其实这不是一个区别的问题,它是不同的时代需要不同 ...
- 基础的CSS描绘测试
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...