覆盖/重新实现PySide中的插槽

时间:2015-01-03 08:50:28

标签: python qt override pyside signals-slots

我的问题与此处发现的几乎完全相同: 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()调用,希望它至少会重新初始化插槽,但是没有运气。

我做错了吗?或者我应该尝试提交错误报告吗?

1 个答案:

答案 0 :(得分:1)

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

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

也没有简单的解决方法。有许多不同的方法可以调用复制和粘贴操作(或它们的等价物),例如键盘快捷键,上下文菜单,拖放等等。可以这样做:但是要做到很多工作< em>完全控制所有这些操作。所以在决定如何继续之前,你需要仔细考虑你想要达到的目标。