PyQt5中如何激活上下文菜单中的快捷键?
问题分析
你写的上下文菜单项鼠标点击正常,但快捷键无法触发,核心原因是:
- 你在右键菜单的创建方法里临时生成QAction和QMenu,菜单关闭后这些对象会被销毁,没有持久化的Action绑定快捷键;
- 仅将Action添加到临时菜单,未把它注册到父部件的快捷键处理系统中。
两种解决方案
方案1:全局生效的快捷键(菜单关闭也能触发)
把QAction设为类的成员变量,添加到ComboBox的Action列表里,这样快捷键会被全局监听:
class MyCheckableComboBox(QComboBox): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setEditable(True) self.lineEdit().setReadOnly(True) self.setStyleSheet("QComboBox QAbstractItemView::item {border: none;padding-left: 5px;}") self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.RightClickMenu) # 初始化全局Action并注册快捷键 self.atoz_action = QAction("Sort A to Z", self) self.atoz_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_R)) self.atoz_action.triggered.connect(self.ascending_order) self.addAction(self.atoz_action) def RightClickMenu(self, pos): menu = QMenu() menu.addAction(self.atoz_action) # 复用已创建的Action menu.exec_(self.mapToGlobal(QPoint(pos))) def ascending_order(self): print("1111ascending order")
方案2:仅菜单打开时生效的快捷键
如果只需要在右键菜单弹出时响应快捷键,给Action设置快捷键上下文为当前菜单即可:
def RightClickMenu(self, pos): menu = QMenu() atoz_action = QAction("Sort A to Z", self) atoz_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_R)) atoz_action.triggered.connect(self.ascending_order) # 限定快捷键仅在菜单激活时生效 atoz_action.setShortcutContext(Qt.WidgetShortcut) menu.addAction(atoz_action) menu.exec_(self.mapToGlobal(QPoint(pos)))
效果验证
- 方案1:按下
Ctrl+R,无论右键菜单是否打开,都会执行排序方法; - 方案2:只有右键菜单弹出时,按下
Ctrl+R才会触发排序。
内容的提问来源于stack exchange,提问作者Hobby_Devloper
相关产品推荐
相关产品推荐

