【问题标题】:How to show a QMenu using global keyboard shortcut in PyQt5?如何在 PyQt5 中使用全局键盘快捷键显示 QMenu?
【发布时间】:2020-04-14 16:51:19
【问题描述】:

我试图通过 PyQt5 的热键(例如“F1”)显示 QMenu 实例,然后我找到了这个包 keyboard

尝试像这样使用它: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_())

其实在__init__中调用self.show_menu方法效果很好,可以按预期弹出一个菜单。

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

有什么问题吗,或者我可以通过其他方式解决吗?请告诉我,谢谢。

【问题讨论】:

    标签: python python-3.x pyqt keyboard pyqt5


    【解决方案1】:

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

    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_())
    

    【讨论】:

      猜你喜欢
      • 2022-12-09
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多