如何在 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)

大家都在看

  • python 练习题:将列表中的大写字母转换成小写

    将列表中的大写字母转换成小写如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,L1 = [‘Hello’, ‘World’, 18, ‘Apple’,…

    Linux 2023年6月8日
    0148
  • 真香警告!JitPack 开源库集成平台

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 简介 官方介绍: JitPack 是一个用于 JVM 和 Android 项目的新颖的包存储库。它按需构建 Git…

    Linux 2023年6月14日
    0127
  • jenkins

    jenkins 1.简介 1.1 SVN介绍 1.2 Maven介绍 1.3 Ant介绍 1.4 Gradle介绍 1.5 jenkins工作原理 1.6 jenkins特点 2….

    Linux 2023年6月7日
    0119
  • 在Windows平台用Visual C++ 2022 (v143)编译PDCurses

    综述 PDCurses是一个开源的跨平台curses库,它提供了一组函数,开发者可以用这组函数在终端(Console、Terminal)上设置光标的位置和字符的显示样式。本文介绍在…

    Linux 2023年6月8日
    0125
  • 你真的了解JAVA中对象和类、this、super和static关键字吗

    作者:小牛呼噜噜 | https://xiaoniuhululu.com计算机内功、JAVA底层、面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 Java对象究竟是什么? 创建…

    Linux 2023年6月6日
    0127
  • 天气干燥怎么防止被静电电到

    可以摸一下墙壁或地板,把电放掉,这样摸门把手之类的金属物品就不会被电到了。 可以摸一下墙壁或地板,把电放掉,这样摸门把手之类的金属物品就不会被电到了。亲身实践,十分有效。只是摸墙和…

    Linux 2023年6月6日
    0103
  • 画图3D Paint 3D工作区黑屏

    最近不知道画图3D抽什么风,黑屏了。 后来研究很久,发现这货竟然是用独立显卡,集显带不起来。 解决方案是在Nvidia控制面板给他分配独立显卡,不要使用集显,不要使用集显,不要使用…

    Linux 2023年6月13日
    0124
  • 【设计模式】Java设计模式-外观模式

    Java设计模式 – 外观模式 😄 不断学习才是王道🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆原创作品,更多关注我CSDN: 一个有梦有戏的人…

    Linux 2023年6月6日
    0160
  • 搭建openvpn连接公司内网

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    0130
  • linux定时删除N天前的旧文件

    语句写法: find 对应目录 -mtime +天数 -name “文件名” -exec rm -rf {} \; 例1:find /usr/local/b…

    Linux 2023年6月13日
    0111
  • ArchLinux安装-2022-01-12

    这篇教程,是我基于B站up住theCW的视频教程整理的,其中添加了一些我在安装n次之后的经验(虽然失败过几次,但我现在安装不会再出差错,所以请放心的看此教程) 当然,我认为theC…

    Linux 2023年6月13日
    0107
  • Shell第四章《正则表达式》

    1.1、名词解释 正则表达式(regular expression, RE)是一种字符模式,用于在查找过程中匹配指定的字符。在大多数程序里,正则表达式都被置于两个正斜杠之间;例如/…

    Linux 2023年6月6日
    0112
  • Java8新特性终极指南

    欢迎来到Java学习之Java8新特性终极指南 目录 系列文章目录 @ 目录 系列文章目录 Java语言新特性 Lambda表达式 函数式接口 方法引用 接口的默认方法 重复注解 …

    Linux 2023年6月13日
    0120
  • Hadoop Shell命令

    http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html Original: https://www.cnblogs.com/…

    Linux 2023年5月28日
    0103
  • linux inode 详解 / 线上inode爆满解决方案

    linux inode 详解 / 线上inode爆满解决方案 本文大量参考阮一峰大神博客,整理笔记 之所以&amp…

    Linux 2023年6月7日
    0121
  • centos安装torch==1.4.0与相关细节

    对于某些直接安装torch==1.4.0报错的情况(没错,就是我遇到了) 在网上查找了,大概的解决方法是先安装一个低版本的torch和torchvision, torchvisio…

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