2015-02-06 36 views
1

鑑於限定狹槽類的超類:連接子信號到超時隙

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的基類中查找。這是可能的,它的語法是什麼?

回答

1

我想出了一個這樣做的方法 - 我不確定這是否是最好的方法。

你需要覆蓋要在子類中調用,並將其轉發給超插槽:

class Bar(QWidget, Foo): 

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

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

PyQt4中,你不能在不繼承的子類使用pyqtSignalpyqtSlot裝飾從QObject。也不可能從繼承自QObject的多個類繼承 - 這意味着,通常無法在子類中繼承自定義信號和插槽。在PyQt5的最新版本中,這些限制大部分已被解除,我不認爲PySide曾經擁有它們 - 但它們是PyQt4的一部分。

所以最簡單的方法來解決您的問題,是從my_slot方法簡單地刪除pyqtSlot修飾器。通常情況下,您將需要使用裝飾器pyqtSlot。使用它的最常見原因是爲了連接具有多個不同簽名的信號而提供多重過載,並且有時在線程之間連接信號和插槽時確保線程安全。

有關更多詳細信息,請參閱PyQt4文檔中的New-style Signal and Slot Support