【问题标题】:Qaction Shortcut in extended contextmenu not triggered未触发扩展上下文菜单中的 Qaction 快捷方式
【发布时间】:2021-07-11 17:36:20
【问题描述】:

我尝试扩展QLineEdit 的上下文菜单,添加一个用于替换文本的附加条目。我可以用.createStandardContextMenu() 扩展上下文菜单,效果很好。但是当我尝试使用.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_R)) 添加快捷方式时,它不会对键做出反应。与我尝试过的不同键相同。此外,使用QAction('&Replace', self) 制作的快捷方式也不起作用。 SO和其他来源中的一些示例以相同的方式构建,所以我想知道没有其他人遇到同样的问题。似乎我错过了什么。但是什么?我想不通,检查了多次docs

工作示例:

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


class ECM(QWidget):

    def __init__(self):
        super(ECM, self).__init__()
        self.setWindowTitle("Extended Context Menu")
        self.lineEdit = QLineEdit()
        self.lineEdit.setContextMenuPolicy(Qt.CustomContextMenu)                            
        self.lineEdit.customContextMenuRequested.connect(self.my_contextMenuEvent)

        layout = QVBoxLayout()
        layout.addWidget(self.lineEdit)
        self.setLayout(layout)

        self.setFixedSize(800,200)
        self.show()

    def replace(self):
        print("replace")

    def my_contextMenuEvent(self):                                           
        print("my_contextMenuEvent")                                         
        menu = self.lineEdit.createStandardContextMenu()
        action = QAction('&Replace', self)
        action.setStatusTip('Replace values')
        action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_R))
        action.triggered.connect(self.replace)
        menu.addAction(action)                                               
        menu.exec_()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    sender = ECM()
    app.exec_()

【问题讨论】:

  • 如果您使用addAction() 将操作添加到小部件,则键盘快捷键会起作用(这意味着您不应每次都创建新操作,而应重复使用当前操作)。

标签: python pyqt5 qmenu qaction


【解决方案1】:

根据musicamante 的评论,我得出以下解决方案:

从文档中摘录:

  1. 如果你想扩展标准上下文菜单,重新实现这个 函数,调用 createStandardContextMenu() 并扩展菜单 返回
  2. QAction 列表(由 actions() 返回)的默认用途是 创建一个上下文 QMenu。

这对我来说并不完全合乎逻辑,不是第一次 ;-)

最终代码:

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


class ECM(QWidget):

    def __init__(self):
        super(ECM, self).__init__()
        self.setWindowTitle("Extended Context Menu")
        self.lineEdit = QLineEdit()
        self.lineEdit.setContextMenuPolicy(Qt.CustomContextMenu)                            
        self.lineEdit.customContextMenuRequested.connect(self.my_contextMenuEvent)

        layout = QVBoxLayout()
        layout.addWidget(self.lineEdit)
        self.setLayout(layout)

        self.setFixedSize(800,200)

        action = QAction('&Replace', self)
        action.setStatusTip('Replace values')
        action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_R))
        action.triggered.connect(self.replace)

        self.lineEdit.addAction(action)

        self.show()

    def replace(self):
        print("replace")

    def my_contextMenuEvent(self):                                           
        menu = self.lineEdit.createStandardContextMenu()
        menu.addActions(self.lineEdit.actions())
        menu.exec_()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    sender = ECM()
    app.exec_()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2013-01-24
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多