如何在PyQt5中使用全局键盘快捷键显示QMenu?

你好,世界 :

我试图通过一个热键(例如“F1”)通过展现出QMenu实例PyQt5,后来我发现这个包的键盘

尝试像这样使用它: keyboard.add_hotkey('F1', self.show_menu, suppress=True)

然后我得到了这些代码:

import sys

import keyboard

from PyQt5.QtCore import Qt
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__(flags=Qt.WindowStaysOnTopHint)

        self.menu = QMenu('Menu')
        self.menu.addAction(QAction('menu1', self.menu))
        self.menu.addAction(QAction('menu2', self.menu))
        self.menu.addAction(QAction('menu3', self.menu))

        self.show_menu()  # this works well

        keyboard.add_hotkey('F1', self.show_menu, suppress=True)  # this hotkey works but not showing the menu

    def show_menu(self):
        print('111')
        self.menu.popup(QCursor().pos())
        print('222')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setQuitOnLastWindowClosed(False)
    win = MainWindow()
    # win.show()
    sys.exit(app.exec_())

实际上,调用的方法self.show_menu__init__效果很好,菜单可以弹出预期。

但是问题是,当我按下热键“ F1”时,将打印“ 111”和“ 222”,但是菜单不会出现。

有什么问题吗,或者我可以通过其他方式做到这一点?请告诉我,谢谢。

eyllanesc:

与add_hotkey关联的回调在辅助线程中执行,并且在OP代码中,回调是show_menu方法,该方法修改了Qt禁止的GUI。解决方案是使用信号:

import sys

import keyboard

from PyQt5.QtCore import Qt, QObject, pyqtSignal
from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import QAction, QApplication, QMainWindow, QMenu


class KeyBoardManager(QObject):
    F1Signal = pyqtSignal()

    def start(self):
        keyboard.add_hotkey("F1", self.F1Signal.emit, suppress=True)


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__(flags=Qt.WindowStaysOnTopHint)

        self.menu = QMenu("Menu")
        self.menu.addAction(QAction("menu1", self.menu))
        self.menu.addAction(QAction("menu2", self.menu))
        self.menu.addAction(QAction("menu3", self.menu))

        manager = KeyBoardManager(self)
        manager.F1Signal.connect(self.show_menu)
        manager.start()

    def show_menu(self):
        print("111")
        self.menu.popup(QCursor.pos())
        print("222")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setQuitOnLastWindowClosed(False)
    win = MainWindow()
    # win.show()
    sys.exit(app.exec_())

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何全局使用键盘快捷键

PyQt5:带QAction的键盘快捷键

如何在 Gtk StackSwitcher 中使用键盘快捷键?

如何在Ubuntu中使用键盘快捷键更改显示方向?

如何在Gnome 2中使用键盘快捷键运行终端?

如何在14.04中使用键盘快捷键并排放置3个窗口?

如何在MS Word 2013中使用键盘快捷键进行放大和缩小?

如何在现有终端会话中打开新选项卡并使用键盘快捷键/修改全局设置

如何在Atom中使用键盘快捷键关闭选项卡?

如何在Fish中使用键盘快捷键来扩展环境变量?

如何在Sublime Text中使用键盘快捷键插入一小段文本?

如何在macOS终端中使用键盘快捷键选择一行?

如何在Firefox中使用键盘快捷键从外部打开PDF?

如何在Excel中使用键盘快捷键忽略自动完成功能?

如何在Anki中使用键盘快捷键输入LaTeX方程式?

如何在SQL Server中使用键盘快捷键(如CTRL + F3)?

如何在RubyMine的对话框中显示可用的键盘快捷键?

如何在键盘快捷键中添加sudo命令?

如何在xubuntu中更改键盘快捷键?

如何在Firefox中设置书签的键盘快捷键?

如何在Eclipse IDE中修改键盘快捷键?

如何在Nautilus 3.4中更改键盘快捷键

如何在nemo中添加键盘快捷键?

如何在emacs中设置新的键盘快捷键?

如何使用键盘快捷键在macOS中显示菜单栏

如何使用键盘快捷键在Eclipse中编译代码

如何使用bash别名或函数中的键盘快捷键?

如何使用键盘快捷键挂起?

如何使用|| 在键盘快捷键上?