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

Posted

技术标签:

【中文标题】在 PySide 中覆盖/重新实现插槽【英文标题】:Overriding/Reimplementing Slots in PySide 【发布时间】:2015-01-03 08:50:28 【问题描述】:

我的问题与此处发现的问题几乎完全相同: 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】:

您不能覆盖QLineEdit.copyQLineEdit.paste 以使它们将被Qt 内部调用。

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

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

【讨论】:

啊,有道理。我想知道那个“虚拟”描述符是什么意思。我可能应该在学习的早期对此进行调查。感谢您的洞察力。

以上是关于在 PySide 中覆盖/重新实现插槽的主要内容,如果未能解决你的问题,请参考以下文章

使用 PySide 覆盖 QWebPage 中的 shouldInterruptJavaScript

带信号/插槽的 PySide IPC

Maya (PySide2) - 重新打开窗口而不是新窗口

Pyside 插槽中的异常处理令人惊讶

将 QML 信号连接到 PySide2 插槽

ruby 在不同的插槽中重新分配会议