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

Posted

技术标签:

【中文标题】PyQt5 在打开的菜单中使用快捷方式【英文标题】:PyQt5 use shortcuts in opened menu 【发布时间】:2020-09-15 12:38:11 【问题描述】:

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

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

我尝试过创建常规的 QShortcut,但是当菜单打开时它们不再响应。我注意到我可以使用向上和向下箭头更改选定的选项,然后使用回车键确认我的选择,因此 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())

【问题讨论】:

`shortcut='A'` 有点奇怪:它不会在上下文菜单中显示快捷方式(当我认为它应该从 Qt5.15 开始时,showShortcutsInContextMenus is True 或可以更改App.styleHints().setShowShortcutsInContextMenus(True). 使用newAct.setShortcuts(["1"]) 确实显示快捷方式...但不足以使其工作。 【参考方案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())

【讨论】:

这行得通,谢谢。理想情况下,我只需按一下按钮即可触发该功能,现在您必须按 A,然后输入,但这有效。【参考方案2】:

打开 QMenu 时,快捷方式未激活,但 accelerator keys 正在工作。你用&声明它们:

    newAct = contextMenu.addAction("New &1", self.triggered)

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

【讨论】:

以上是关于PyQt5 在打开的菜单中使用快捷方式的主要内容,如果未能解决你的问题,请参考以下文章

VS2013安装完之后,桌面没快捷方式,原文件夹在哪里找到打开的程序?

win10怎么把开始菜单中程序图标设置桌面快捷方式

小工具在新文件夹中打开快捷方式所指向的文件

Win10 使用快捷方式启动 Python PyQt5 应用程序

快捷方式

访问 PyQt5 组件的内置快捷方式?