未触发扩展上下文菜单中的 Qaction 快捷方式
Qaction Shortcut in extended contextmenu not triggered
我尝试使用用于替换文本的附加条目来扩展 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_()
根据musicamante的评论,我得出以下解决方案:
文档摘录:
- 如果你想扩展标准上下文菜单,重新实现这个
函数,调用 createStandardContextMenu() 并 扩展菜单
返回.
- 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_()
我尝试使用用于替换文本的附加条目来扩展 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_()
根据musicamante的评论,我得出以下解决方案:
文档摘录:
- 如果你想扩展标准上下文菜单,重新实现这个 函数,调用 createStandardContextMenu() 并 扩展菜单 返回.
- 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_()