Overriding/Reimplementing PySide 中的插槽

Overriding/Reimplementing Slots in PySide

我的问题几乎与此处发现的问题完全相同: Override shouldInterruptJavaScript in QWebPage with PySide

在我的例子中,虽然我想覆盖 QLineEdit 上的复制和粘贴槽

import sys
from PySide import QtGui, QtCore

class myLineEdit(QtGui.QLineEdit):
    # FIXME: This is not working, the slot is not overriden!
    @QtCore.Slot()
    def copy(self):
        print 'overridden copy event'
        App.clipboard().setText('customized text')
        return False

    @QtCore.Slot()
    def paste(self):
        print 'overridden paste event'
        self.setText('customized text')
        return False

if __name__ == "__main__":
    App = QtGui.QApplication(sys.argv)
    Widget = myLineEdit()
    Widget.show()
    cmenu = Widget.createStandardContextMenu()
    sys.exit(App.exec_())

我正在使用 Python 2.7.3,PySide 1.2.2

我不知道这些方法是否应该被覆盖,但我找不到任何说明它们不应该被覆盖的文档。

我也找到了这个页面 http://qt-project.org/faq/answer/is_it_possible_to_reimplement_non-virtual_slots

该页面解释了某些类型的插槽如何通过在初始化对象时调用的函数获取指向它们的指针(或者类似的内容,我对 C++ 不太熟悉)。

按照这个逻辑,我在上面添加了 createStandardContextMenu() 调用,希望它能至少为上下文菜单重新初始化插槽,但没有成功。

我是不是做错了什么?或者我应该尝试提交错误报告?

您不能以 Qt 内部调用的方式覆盖 QLineEdit.copyQLineEdit.paste

一般来说,您只能有效地覆盖或重新实现定义为 虚拟 的 Qt 函数。 Qt 文档将始终指定是否是这种情况,对于 QLineEdit,没有以这种方式定义的 public slots

也没有简单的解决方法。有很多不同的方法可以调用复制和粘贴操作(或它们的等价物),例如键盘快捷键、上下文菜单、拖放等。可以做到:但是要获得完全 控制所有这些操作。因此,在决定如何进行之前,您需要仔细考虑要实现的目标。