连接子信号到超时隙

问题描述:

鉴于限定狭槽类的超类:连接子信号到超时隙

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的基类中查找。这是可能的,它的语法是什么?

我想出了一个这样做的方法 - 我不确定这是否是最好的方法。

你需要覆盖要在子类中调用,并将其转发给超插槽:

class Bar(QWidget, Foo): 

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

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

PyQt4中,你不能在不继承的子类使用pyqtSignalpyqtSlot装饰从QObject。也不可能从继承自QObject的多个类继承 - 这意味着,通常无法在子类中继承自定义信号和插槽。在PyQt5的最新版本中,这些限制大部分已被解除,我不认为PySide曾经拥有它们 - 但它们是PyQt4的一部分。

所以最简单的方法来解决您的问题,是从my_slot方法简单地删除pyqtSlot修饰器。通常情况下,您将需要使用装饰器pyqtSlot。使用它的最常见原因是为了连接具有多个不同签名的信号而提供多重过载,并且有时在线程之间连接信号和插槽时确保线程安全。

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