将子类信号连接到超类槽

时间:2015-02-06 06:50:01

标签: python-2.7 pyqt4 multiple-inheritance signals-slots

给定一个定义槽的超类:

class Foo(object):

    @pyqtSlot()
    def my_slot(self):
        print('Called my_slot')

是否可以将子类中的信号连接到此?

class Bar(QWidget, Foo):

    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        Foo.__init__(self)
        self.combo = QComboBox()
        self.combo.currentIndexChanged[str].connect(
            self.my_slot)

这失败了,因为它似乎没有查找my_slot的基类。这是可能的,实现它的语法是什么?

2 个答案:

答案 0 :(得分:1)

我想出了一种方法 - 我不确定这是否是最佳方式。

您需要覆盖要在子类中调用的插槽并将其转发到超类:

class Bar(QWidget, Foo):

    def __init__(self, parent=None):
        # As before

    @pyqtSlot()
    def my_slot(self):
        super(Bar, self).my_slot()

答案 1 :(得分:1)

在PyQt4中,您不能在不从pyqtSignal继承的子类中使用pyqtSlotQObject装饰器。它也不可能从多个继承自QObject的类继承 - 这意味着,通常,无法继承子类中的自定义信号和槽。在PyQt5的最新版本中已经取消了大部分限制,我不认为PySide曾经拥有它们 - 但它们是PyQt4的永久性部分。

因此,解决问题的最简单方法是从pyqtSlot方法中删除my_slot装饰器。您通常很少需要使用pyqtSlot装饰器。使用它的最常见原因是提供多个重载以连接具有多个不同签名的信号,有时在线程之间连接信号和插槽时确保线程安全。

有关详细信息,请参阅PyQt4文档中的New-style Signal and Slot Support