如何在 pyqt 中捕获并处理 Alt+F4 快捷键

前言

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

如何在 pyqt 中捕获并处理 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 快捷键

Original: https://www.cnblogs.com/zhiyiYo/p/16324409.html
Author: 之一Yo
Title: 如何在 pyqt 中捕获并处理 Alt+F4 快捷键

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582814/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球