Qt PySide2实现全局热键(原生)

PySide2使用屏幕虚拟键盘 1.屏幕虚拟键盘 创建文件virtualkeyboard.py import sys, os from PySide2.QtWidgets import QApplication, QLineEdit if __name__ == "__main__": os.environ["QT_IM_MODULE"] = "qtvirtualkeyboard" # 导入虚拟键盘 ap. 阅读详情

Qt PySide2实现全局热键(原生)

全局热键,指无论你的Qt程序有焦点还是最小化到托盘,热键都能响应,这就需要通过原生系统API来实现(本篇文章只实现了window系统)

创建一个系统托盘程序

class TrayIcon(QtWidgets.QWidget):
    def __init__(self) -> None:
        super().__init__()
        self.setupUi()
        self.installEventFilter(self)

    def setupUi(self):
        self.trayIcon = QtWidgets.QSystemTrayIcon()
        # 图标下载网站 https://www.iconfont.cn/
        self.icon = QtGui.QIcon("some.png")
        self.trayIcon.setIcon(self.icon)
        self.trayIcon.show()
        self.trayMenu = QtWidgets.QMenu()
        self.trayExit = QtWidgets.QAction()
        self.trayExit.triggered.connect(lambda : self.close())
        self.trayMenu.addAction(self.trayExit)

        self.trayIcon.setContextMenu(self.trayMenu)

        self.retranslateUi()

    def retranslateUi(self):
        self.trayExit.setText(QtCore.QCoreApplication.translate("Notes", '退出', None))

创建nativeEventFilter

class NativeEvent(QtCore.QAbstractNativeEventFilter):
    def __init__(self):
        super().__init__()

    def nativeEventFilter(self, eventType, message):
        from ctypes import wintypes
        msg = wintypes.MSG.from_address(message.__int__())
        if eventType == 'windows_generic_MSG' and msg.message == win32con.WM_HOTKEY:
            print("hot key pressed")
        return False, 0

注册热键和注销热键

hotkey_id = 1
# 键码对照 https://learn.microsoft.com/zh-cn/windows/win32/inputdev/virtual-key-codes
hotkey_vk = 0x50

hotkey_fsModifiers = win32con.MOD_ALT
user32 = ctypes.windll.user32
def register_hotkey():
    # 注册 Alt+P 热键
    # 函数解释 https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-registerhotkey?redirectedfrom=MSDN
    success = user32.RegisterHotKey(None, hotkey_id, hotkey_fsModifiers, hotkey_vk)
    if not success:
        print("热键注册失败")

def unregister_hotkey():
    success = user32.UnregisterHotKey(None, hotkey_id)

main

def main():
    try:
        app = QtWidgets.QApplication()
        # app.setQuitOnLastWindowClosed(False)
        widget = TrayIcon()
        # widget.show()
        nativeEvent = NativeEvent()
        app.installNativeEventFilter(nativeEvent)
        register_hotkey()
        app.exec_()
    # except:
    #     print('except')
    finally:
        unregister_hotkey()

if __name__ == '__main__':
    main()

附完整代码

import ctypes
from PySide2 import QtCore
from PySide2 import QtGui
from PySide2 import QtWidgets

import win32con

class TrayIcon(QtWidgets.QWidget):
    def __init__(self) -> None:
        super().__init__()
        self.setupUi()
        self.installEventFilter(self)

    def setupUi(self):
        self.trayIcon = QtWidgets.QSystemTrayIcon()
        # 图标下载网站 https://www.iconfont.cn/
        self.icon = QtGui.QIcon("some.png")
        self.trayIcon.setIcon(self.icon)
        self.trayIcon.show()
        self.trayMenu = QtWidgets.QMenu()
        self.trayExit = QtWidgets.QAction()
        self.trayExit.triggered.connect(lambda : self.close())
        self.trayMenu.addAction(self.trayExit)

        self.trayIcon.setContextMenu(self.trayMenu)

        self.retranslateUi()

    def retranslateUi(self):
        self.trayExit.setText(QtCore.QCoreApplication.translate("Notes", '退出', None))

class NativeEvent(QtCore.QAbstractNativeEventFilter):
    def __init__(self):
        super().__init__()

    def nativeEventFilter(self, eventType, message):
        from ctypes import wintypes
        msg = wintypes.MSG.from_address(message.__int__())
        if eventType == 'windows_generic_MSG' and msg.message == win32con.WM_HOTKEY:
            print("hot key pressed")
        return False, 0

hotkey_id = 1
# 键码对照 https://learn.microsoft.com/zh-cn/windows/win32/inputdev/virtual-key-codes
hotkey_vk = 0x50

hotkey_fsModifiers = win32con.MOD_ALT
user32 = ctypes.windll.user32
def register_hotkey():
    # 注册 Alt+P 热键
    # 函数解释 https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-registerhotkey?redirectedfrom=MSDN
    success = user32.RegisterHotKey(None, hotkey_id, hotkey_fsModifiers, hotkey_vk)
    if not success:
        print("热键注册失败")

def unregister_hotkey():
    success = user32.UnregisterHotKey(None, hotkey_id)

def main():
    try:
        app = QtWidgets.QApplication()
        # app.setQuitOnLastWindowClosed(False)
        widget = TrayIcon()
        # widget.show()
        nativeEvent = NativeEvent()
        app.installNativeEventFilter(nativeEvent)
        register_hotkey()
        app.exec_()
    # except:
    #     print('except')
    finally:
        unregister_hotkey()

if __name__ == '__main__':
    main()

参考:
xxxxGPT
https://blog.youkuaiyun.com/m0_60259116/article/details/128631482

Python界面编程第十九课:Pyside2 (Qt For Python)创建菜单 先看完整代码: from PySide2.QtWidgets import QApplication,QMainWindow, QAction import sys from PySide2.QtGui import QIcon class Window(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Simple Note Pad Application") 阅读详情

相关推荐

基于C++与Qt的跨平台截图工具开发实战:从原理到实现

在桌面应用开发领域,图形用户界面(GUI)框架是实现交互功能的核心。Qt作为成熟的跨平台C++框架,通过其强大的图形视图系统(QGraphicsView/Scene)和事件处理机制,为开发者提供了构建高性能桌面应用的基础。理解其原理,如信号与槽的通信、坐标系统与绘图管线,是进行高效开发的关键。这种技术组合的价值在于,它能将底层系统API抽象化,让开发者专注于业务逻辑,从而快速实现功能丰富、响应迅捷的应用程序。其典型应用场景包括需要复杂图形交互的工具软件,例如本文探讨的截图工具。通过利用Qt的QPixmap进

weixin_34319374的博客 359

简易实现QT中的virtualkeyboard及问题总结

虚拟键盘实现

麒麟001号的博客 4508

用PySide6构建窗口跟随悬浮窗:以Codex为实例

桌面自动化是现代效率工具开发中的重要方向,它涉及对窗口、进程和坐标等系统资源的精确控制。在Windows平台上,通过user32.dll提供的API,我们可以枚举窗口、获取坐标并实现跨窗口联动。这类技术常用于开发悬浮窗、状态监控等工具。当需要让一个无边框置顶窗口跟随另一个窗口移动时,就涉及窗口遍历、进程匹配和DPI坐标换算等关键点。以PySide6实现悬浮窗为例,结合psutil进程查找和QTimer轮询机制,可以构建一个实时跟随Codex CLI的桌面浮窗,解决多窗口切换时的视觉成本问题。该方案不仅适用于

weixin_34289454的博客 404

trayIcon的使用

Qt里面的托盘图标还是比较好实现的。可以单独一个模块,继承于上面的标准托盘图标类。 在主界面上,实例化一个托盘图标对象出来。然后把托盘图标对象的parent置成主界面对象。 下面是网上一位猿的程序里拷贝出来的例子。 其中setContextMenu用来给托盘图片设置一个弹出菜单,可以进行一些动作,比如例子中的显示,关闭。 另外比较重要的就是signal activated的对应到的slot

pfm685757的专栏 1689

一个基于pyside6开发的windows平台悬浮球工具

windows 一个基于pyside6开发的windows平台悬浮球工具.

qt全局热键 全平台 支持qt5

qxtglobalshortcut是一个qt上的对系统全局热键的第三方的解决方案,完美跨平台,只是网上流传的代码都不能用在最新的qt 5.3.1,所以我就自己改写了一个,除了增加对qt5的支持外其他没有任何变化。

Windows下QT使用VirtualKeyboard键盘

公司最新的项目要使用QT, 快不惑年纪的年龄学下QT怎么玩... 之前虚拟键盘的问题在Linux下编译使用,老是发现模块没有找到, 反正都是学习下使用, 所以还是找了下Windows下的QT的版本如何使用, 直接上菜~ 在main.cpp中设置: qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard")); 使用这种方式必须在QGuiApplication app(argc, argv)之前: 第一种集成方式 只需要导入键盘模块: impor.

Joey 的工作空间~ 4088

基于pyside6开发的windows平台悬浮球工具python源码+项目说明+超详细注释.zip

基于pyside6开发的windows平台悬浮球工具python源码+项目说明+超详细注释.zip # floating_ball 基于pyside6开发的windows平台悬浮球工具 “双窗口悬浮球.py”用于在解释器内运行 “双窗口悬浮球_编译.py”用于pyinstaller打包 启动后显示一悬浮球窗口 ![image-20230311223719912](README.assets/image-20230311223719912.png) 触摸点击或鼠标点击后显示菜单 ![image-20230313191943992](README.assets/image-20230313191943992.png) 各按钮功能 1. 启动任务视图 2. 启动quicker 3. 切换显示器,用于将悬浮窗直接移动到另一显示器上,也可以通过鼠标拖动到另以显示器实现 4. 返回悬浮球 5. 显示桌面 6. 启动任务管理器 7. 启动utools 8. 截图 对于中间滑块,拖动滑块部分调节音量、拖动中心部分移动窗口、单击中心部分播放或暂停音乐

PySide/PyQt实现全局热键

抄代码得带上自己的思考,光复制粘贴是没有出路的!项目已开源(Github地址),实现的是课堂上生成随机数抽学号(优雅得超乎你想象),有兴趣可以去看看。

sudo的博客 2007

Unity URP项目里Post Processing死活没效果?别急,这5个坑我帮你踩过了

本文详细解析了Unity URP项目中Post Processing效果不显示的5个常见问题及解决方案,包括管线配置、Volume设置、摄像机选项、Layer冲突和Shader兼容性。通过专业排查步骤和实用代码片段,帮助开发者快速定位并修复后处理效果失效问题,提升项目开发效率。

weixin_28693309的博客 233

LVGL高效加载外部Flash图片资源的实现与优化

本文深入探讨了在嵌入式UI开发中,如何为LVGL高效加载外部Flash中的图片资源。针对内部Flash容量不足的痛点,详细解析了LVGL的图片处理原理,并对比了内存映射与流式解码两种主流实现方案。文章重点提供了性能优化技巧与实战避坑指南,旨在帮助开发者实现流畅的图片加载体验,解决SPI Flash读取慢、内存占用高等核心挑战。

t1u2v的博客 462

PasteMD与Qt集成:开发跨平台桌面客户端

本文介绍了如何在星图GPU平台上自动化部署✨ PasteMD - 剪贴板智能美化工具镜像,实现跨平台桌面端的富文本格式智能转换。用户可一键部署后,高效处理从ChatGPT、Excel等来源复制的混乱内容,在Word/WPS中自动修复公式、表格与代码块,显著提升办公文档处理效率。

weixin_28721743的博客 39

从硅片到时钟:揭秘SiTime MEMS谐振子的精密制造之旅

本文深入解析了SiTime MEMS谐振子的精密制造工艺,从硅晶圆的提纯到DRIE深硅刻蚀,再到真空封装技术,揭示了其如何克服传统石英晶振的局限。通过对比测试数据,展示了MEMS谐振子在精度、可靠性和生产效率上的显著优势,特别是在5G基站和汽车电子等领域的应用潜力。

weixin_42522953的博客 401

从零构建轻量级桌面宠物:PySide6实现透明窗口与交互逻辑

桌面宠物应用是一种常驻桌面的轻量级交互进程,它通过创建透明、无边框的顶层窗口,结合精灵动画或程序化绘制技术,为用户提供个性化的数字陪伴体验。其技术原理核心在于窗口管理、事件处理和资源渲染,能够在低系统资源占用的前提下实现鼠标交互、状态切换等动态行为。这类应用的技术价值在于平衡功能丰富性与系统轻量化,为开发者提供了探索GUI编程、状态机设计和系统集成的实践场景。在具体实现中,PySide6框架因其强大的窗口控制能力和适中的学习曲线,成为构建跨平台桌宠应用的优选方案,而合理的状态管理与资源优化则是保障应用流畅运

cqwmy840702的博客 535

SoIC、CoWoS、InFO一次讲透:从2D/2.5D/3D看懂先进封装

先进封装是后摩尔时代提升芯片性能的关键路径,但面对SoIC、CoWoS、InFO这些名词,很多人容易混淆。理解它们,需从最基本的2D、2.5D、3D封装概念入手:2D是传统平房,2.5D通过硅中介层实现高密度互连,3D则让芯片直接堆叠。CoWoS作为2.5D中介层封装,已成为AI芯片与HBM高带宽存储集成的行业标准;SoIC通过铜-铜混合键合实现真正的3D堆叠,为逻辑与缓存提供极致带宽;InFO以扇出型封装兼顾成本与集成度,广泛用于移动SoC。在系统级封装(SiP)和CPO共封装光学等前沿趋势中,这些技术往

weixin_42388898的博客 309

【解决问题】‘vue‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

【解决问题】'vue' 不是内部或外部命令,也不是可运行的程序或批处理文件。

weixin_44566194的博客 4万+

1+1=2的 blog 文章索引

百度空间中 原blog部分文章 索引:http://hi.baidu.com/cyclone/home Qt Bugs 通过 Qt Bugs 学习 Qt 似乎是一个不错的方法。 QString之arg使用一则 QTBUG-19027 QMainWindow上下文菜单内存泄露 QToolBar焦点问题 QTBUG-18896 QFtp 与中文问题 QTBUG-11458 Qt国...

gaofen100 110

YOLO26科研升级:OREPA在线重参数化,让模型精度在训练中持续跃升

在目录下,新建AddModules文件夹,将orepa.py放入其中。

LXY_LOVE36的博客 98
上一篇: MySQL NDB Cluster使用docker compose一键部署
下一篇: Sanic 实现 HTTP Range,解决前端视频无法拖动问题
zoutao98
博客等级 码龄9年 9粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值