Y Y524资源站

pyqt5,6之图形界面填坑之注册全局快捷键实现主窗口隐藏显示切换遇到的问题

详细介绍pyqt5、6图形界面开发时通过注册全局快捷键实现主窗口隐藏显示切换的方法及遇到的问题及问题的解决方法。

2023-08-16 3600 次阅读 编程教程

前言:

对于常用电脑的工作人员来说,剪贴板工具可以帮助他们更快地复制和粘贴文本、图像和其他类型的数据。可以将经常使用的文本片段、常见的回复模板、重复的命令等保存到剪贴板工具中,随时调用它们,避免了重复输入和查找的繁琐。Windows 10和Windows 11都提供了自动的剪贴板工具,但最让人受不了的就是记录数据量太少并且不能使用快捷键输入。所以一款好用的方便的剪贴板工具就显得尤为重要。小编试过很多款复制粘贴助手类型的工具,大多都有着各种问题,诸如:有的功能太过复杂、有的功能又太过单一,甚至有的还要充会员.....目前小编如何的是“蓝牛复制粘贴助手”就是要收费的,而且没有单条数据置顶排序功能。所以小编就相关使用python3+pyqt6制作一款自用的剪贴板自制粘贴助手工具......

pyqt6实现python界面开发

我是怎么做的?

熟话说万事开头难,由于没有过多的pyqt界面开发验验,一切都得现学现用,我这开头也难。没办法就想到了目前最火的AI模型chatgpt,正常最近分享过一款免费的CHATGPT“灵动Ai助手”,于是跟gpt说“给我一个pyqt6基于QApplication的简单用例”,在chatgpt的的帮助下将代码完善后终于完成了界面的制作编写并跑通。

chatgpt写python代码

具体代码这里就不贴出来了,文章下方会给出所有相关代码的下载。这里只说说使用大概的过程,具体自行百度吧。

  • 1、使用QT designer设计出一个界面,并将界面的.ui文件转换成.py的代码得到Ui_MainWindow类,当然在主程序中也可直接调用.ui的界面文件。

    PyQt加载ui界面Ui_MainWindow类

  • 2、结合上面提到用chatGpt生成的代码片段,引入.ui文件转换成.py的代码库。这里要说一下,我已知的比较通用的引入并使用Ui_MainWindow类的方法分继承Ui_MainWindow和承继承Ui_MainWindow,使用上大同小异,下图给出参考

    PyQt加载ui界面Ui_MainWindow类

  • 3、剩下的就是窗口及控件的美化了,我将我的pyqt6界面设置了无边框、背景透明等效果,具体代码请在下方下载;

python+pyqt6界面开发都有哪些坑?

坑太多了,一下真说不清楚,如pyqt6和pyqt5的代码不通用、界面卡死等。。。。

  • 1、pyqt6和pyqt5的代码不通用主要原因是在pyqt6版本中对部分方法及类用了修改及迁移,然而社区对应pyqt6的资料太少所以只能找到pyqt5的代码例子。(后面都是通过灵动Ai助手解决的代码兼容问题)

  • 2、pyqt5、6使用第三方快捷键监听库 坑死人的大坑。

在开发过程中,需要通过全局快捷键实现pyqt6窗口的显示和隐藏,百度一搜索就能找到相关的代码例子,诸如下面代码片段:

#下面是一个监听全局快捷键的Python代码示例,它使用了第三方库`keyboard`。

```python
import keyboard

def on_hotkey():
    print("Global hotkey pressed!")

# 注册全局快捷键 Ctrl+Shift+A
keyboard.add_hotkey("Ctrl+Shift+A", on_hotkey)

# 启动监听
keyboard.wait()
```

#下面是一个监听全局快捷键的Python代码示例,它使用了第三方库`pynput`。
from pynput import keyboard

def on_press(key):
    if key == keyboard.Key.ctrl_l and key == keyboard.Key.shift_l and key.char == 'a':
        print("Global hotkey pressed!")

# 创建监听器
listener = keyboard.Listener(on_press=on_press)

# 启动监听
listener.start()

# 保持运行,以便监听器在后台继续监听
listener.join()

确实,不论是keyboard还是pynput库在python单独使用都很不错,然而当我将它们回到pyqt6代码中后就出问题了。

问题主要出现在通过快捷键切换pyqt主窗口隐藏和显示时,窗口出现了卡死的情况,并且在窗口恢复时无法将窗口显示在最上层(最小化和恢复最小化也是一样问题)

pyqt6窗口显示在最上层

如上图,窗口窗口默认是在最上层显示,然后通过快捷键将窗口隐藏,期间如果操作过其它软件再切换为显示状态后pyqt6窗口将如上图那样被其它窗口遮挡。。。通过各种查资料找教程,都是说要设置窗口状态标志,如下面代码,但根据解决不了问题。(注意:这里提到的pyqt窗口或界面不显示在最上层的问题不是置顶问题,因为置顶是将窗口固定在屏幕最上层,而跟我要的明显不是一个)

self.activateWindow()    #设置窗口为激活状态
self.setWindowState(self.windowState() & Qt.WindowState.WindowActive)#设置窗口为激活状态
self.raise_()    #设置窗口为最上层显示

具体出了什么问题?又怎么解决?

在试过无数的方法都不能解决pyqt界面不显示在最上层的问题后,我也没有放弃,我坚信一定能找到问题,于是我又继续在网上浏览。

终于在网上找解决方案时无意中看到另外一款可以用于python注册全局热键的库“system_hotkey”,了解到它是基本windows win32con API实现,眼看有戏,于是马上安装测试。果真有效!

由于system_hotkey库的代码例子中使用了pyqt的信号 “pyqtSignal”,所以为了验证问题是否是由python热键模块不兼容导致,我又重新测试了keyboard和pynput这两个python快捷键注册库,同样也使用了pyqt的信号 “pyqtSignal”来监听快捷键的动作,得出结果与pyqt的信号 “pyqtSignal”监听无关,主要问题就是出在keyboard和pynput这两个python快捷键注册库上面,具体错误原因我也没有能力找出来,但大概能猜测出这个肯定跟keyboard和pynput这两个python快捷键注册库的底层实现有关。

另外,在system_hotkey注册全局快捷键时发现有不少按键组合无法使用,经过查看system_hotkey原代码发现是作者没有写完善,比如需要浏览ctrl+`组合键(“`”是键盘Esc下面那个按键)就会报错,最后定位到system_hotkey即system_hotkey.py文件,在字典vk_codes中增加'`':win32con.N_TMASK1即可。

Python教程 python3源码