如何在 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):
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用