Python QAction捷径“;粘贴";不会触发
我正在使用Pyside2(在windows中)编写一个字处理器。我有一个用于粘贴的QAction和此操作的快捷方式:Python QAction捷径“;粘贴";不会触发,python,pyside2,Python,Pyside2,我正在使用Pyside2(在windows中)编写一个字处理器。我有一个用于粘贴的QAction和此操作的快捷方式: toolbar = QToolBar("Toolbar") self.addToolBar(toolbar) paste_action = QAction("Paste", self) paste_action.setShortcut(QKeySequence.Paste) paste_action
toolbar = QToolBar("Toolbar")
self.addToolBar(toolbar)
paste_action = QAction("Paste", self)
paste_action.setShortcut(QKeySequence.Paste)
paste_action.triggered.connect(self.fn_paste)
toolbar.addAction(paste_action)
def fn_paste(self):
print("pasted")
预期的行为是,当我点击ctrl+v(windows中的粘贴快捷方式)并将焦点放在QTextEdit上时,它应该运行fn_粘贴。相反,它将剪贴板中的文本粘贴到QTextEdit中,并且不运行fn_粘贴。如果我设置的话也一样
paste_action.setShortcut(QKeySequence("CTRL+V"))
但是当我使用其他的键序列时
paste_action.setShortcut(QKeySequence("CTRL+E"))
它确实按预期工作(在控制台中打印“粘贴”)
以下情况也会出现同样的问题:
paste_sc = QShortcut(QKeySequence.Paste, self)
paste_sc.activated.connect(self.fn_paste)
我猜系统快捷键“ctrl+v”会以某种方式覆盖应用程序快捷键?(但我不知道)
也许我遗漏了什么(我几天前才开始使用QT,现在还是个呆子)。所以我怎样才能让它工作
根据要求,提供一个最小的、可复制的示例:
import sys
from PySide2.QtGui import (
QKeySequence,
)
from PySide2.QtWidgets import (
QApplication,
QMainWindow,
QTextEdit,
QToolBar,
QAction,
)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
textfield = QTextEdit()
self.setCentralWidget(textfield)
toolbar = QToolBar("Toolbar")
self.addToolBar(toolbar)
paste_action = QAction("Paste", self)
paste_action.setStatusTip("Paste from clipboard")
paste_action.setShortcut(QKeySequence.Paste) #does not work
# paste_action.setShortcut(QKeySequence("CTRL+V")) #does not work
# paste_action.setShortcut(QKeySequence("CTRL+E")) #works but wrong shortcut
paste_action.triggered.connect(self.fn_paste)
toolbar.addAction(paste_action)
def fn_paste(self):
print("Pasted")
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
我现在使用事件过滤器来获得所需的结果。由于我仍在试图弄清楚它是如何工作的以及为什么工作的(我只有一个粗略的想法,一些解释方面的帮助会很好),对此持保留态度: mre:
请提供一个最小的可复制示例added@Koyagi粘贴快捷方式一有焦点就会被textedit自动抓取,因为它是窗口中唯一的小部件,所以不会传播到(父)小部件。实际的问题是:为什么需要覆盖已经存在的快捷方式(这被广泛认为是粘贴操作的约定)?“而且因为它是窗口中唯一的小部件”-它是请求的极简示例中唯一的小部件,而不是我的项目中的小部件。“实际的问题是:为什么…”-(这不是实际的问题..至少不是我的)我想让它粘贴文本,但我还需要调用一个由粘贴文本触发的函数,并且找不到任何可能的方法(除了不使用常用的ctrl+v),因为没有“ontextpasted”,我不能使用“ontextchanged”因为我想要调用的函数将改变文本并导致无限循环(除此之外,它调用函数的频率远远超过需要)。
import sys
from PySide2.QtCore import (
QEvent
)
from PySide2.QtGui import (
QKeySequence,
)
from PySide2.QtWidgets import (
QApplication,
QMainWindow,
QTextEdit,
QToolBar,
QAction,
)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.textfield = TextField()
self.setCentralWidget(self.textfield)
toolbar = QToolBar("Toolbar")
self.addToolBar(toolbar)
paste_action = QAction("Paste", self)
paste_action.setShortcut(QKeySequence.Paste)
paste_action.triggered.connect(self.fn_paste)
toolbar.addAction(paste_action)
def fn_paste(self):
self.textfield.paste()
print("Pasted")
class TextField(QTextEdit):
def __init__(self):
super().__init__()
self.installEventFilter(self)
def eventFilter(self, object, event):
if event.type() == QEvent.ShortcutOverride:
return True
return False
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()