Python 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

我正在使用Pyside2(在windows中)编写一个字处理器。我有一个用于粘贴的QAction和此操作的快捷方式:

    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_()