PyQt5 在打开的菜单中使用快捷方式

PyQt5 use shortcuts in opened menu

在 PyQt5 应用程序中,我有一个 QMenu。我想让它在菜单打开后,用户可以使用键 1、2、3 等来 select 菜单中的选项 1、2、3 等。但是,我在设置快捷方式或获取对按键做出反应的快捷方式时遇到问题。

我从 this 网站上取了一个例子,并对其稍作修改以显示我的问题。我尝试在 addAction 函数中分配快捷方式,但这不起作用。

我试过创建常规的 QShortcuts,但当菜单打开时它们不再响应。我注意到我可以使用向上和向下箭头更改 selected 选项,然后使用回车键确认我的 selection,因此 QMenu 能够捕获按键。但是如何分配自己的快捷方式?

from PyQt5 import QtGui
from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu
import sys


class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.title = "PyQt5 Context Menu"
        self.top = 200
        self.left = 500
        self.width = 400
        self.height = 300
        self.InitWindow()


    def InitWindow(self):
        self.setWindowIcon(QtGui.QIcon("icon.png"))
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.show()

    def contextMenuEvent(self, event):
        contextMenu = QMenu(self)
        newAct = contextMenu.addAction("New", self.triggered, shortcut='A')
        openAct = contextMenu.addAction("Open", self.triggered2, shortcut='B')
        quitAct = contextMenu.addAction("Quit", self.triggered3, shortcut='C')
        action = contextMenu.exec_(self.mapToGlobal(event.pos()))
        if action == quitAct:
            self.close()

    def triggered(self):
        print("triggered 1")

    def triggered2(self):
        print("triggered 2")

    def triggered3(self):
        print("triggered 3")
App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())

打开 QMenu 时,快捷方式未激活,但 accelerator keys 有效。你用 &:

声明它们
    newAct = contextMenu.addAction("New &1", self.triggered)

弹出上下文菜单时,按 1 会触发正确的功能。

QKeySequence class 封装了快捷键使用的键序列。 更多... https://doc.qt.io/qt-5/qkeysequence.html

试一试:

import sys
from PyQt5 import QtGui
from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu


class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.title = "PyQt5 Context Menu"
        self.top = 200
        self.left = 500
        self.width = 400
        self.height = 300
        self.InitWindow()

    def InitWindow(self):
        self.setWindowIcon(QtGui.QIcon("icon.png"))
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.show()

    def contextMenuEvent(self, event):
        contextMenu = QMenu(self)
#        newAct = contextMenu.addAction("New", self.triggered, shortcut='A')
        newAct = contextMenu.addAction(
            "New (&A)", self.triggered, shortcut=QtGui.QKeySequence.New)            # +++
        openAct = contextMenu.addAction(
            "Open (&B)", self.triggered2, shortcut=QtGui.QKeySequence.Open)         # +++
        quitAct = contextMenu.addAction(
            "Quit (&C)", self.triggered3, shortcut=QtGui.QKeySequence.Quit)         # +++
        action = contextMenu.exec_(self.mapToGlobal(event.pos()))
        if action == quitAct:
            self.close()

    def triggered(self):
        print("triggered 1")

    def triggered2(self):
        print("triggered 2")

    def triggered3(self):
        print("triggered 3")
        
        
App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())