2012-06-23 35 views
6

連接一個重載PyQt的信號我設計一個定製窗口小部件,其基本上是一個QGroupBox保持的QCheckBox按鈕,其中它們中的每一個應控制在所表示的位掩碼的特定位可配置數目由QBitArray提供。爲了做到這一點,我添加了QCheckBox實例到QButtonGroup,與每個按鈕給出的整數ID:使用新型的語法

def populate(self, num_bits, parent = None): 
     """ 
     Adds check boxes to the GroupBox according to the bitmask size 
     """ 
     self.bitArray.resize(num_bits) 
     layout = QHBoxLayout() 

     for i in range(num_bits): 
      cb = QCheckBox() 
      cb.setText(QString.number(i)) 
      self.buttonGroup.addButton(cb, i) 
      layout.addWidget(cb) 
     self.setLayout(layout) 

然後,包含在self.buttonGroup每次用戶會點擊複選框,我想self.bitArray被通知,所以可以相應地設置/取消設置數組中的相應位。對於我打算連接QButtonGroup的buttonClicked(INT)信號QBitArray的toggleBit(INT)方法,來,我想用新型信號語法,所以我想這是儘可能Python的:

self.buttonGroup.buttonClicked.connect(self.bitArray.toggleBit) 

的問題是,buttonClicked是一個重載信號,所以也是buttonClicked(QAbstractButton *)簽名。事實上,當程序執行我得到這個錯誤,當我點擊複選框:

The debugged program raised the exception unhandled TypeError 
"QBitArray.toggleBit(int): argument 1 has unexpected type 'QCheckBox'" 

這清楚地表明瞭toggleBit方法收到buttonClicked(QAbstractButton *)信號,而不是buttonClicked( int) one。

所以,問題是,我怎麼可以指定信號連接,使用新型的語法,使self.bitArray接收buttonClicked(INT)信號而不是默認的過載 - buttonClicked (QAbstractButton *)

編輯:PyQT's New-style Signal and Slot Support documentation規定可以使用pyqtSlot裝飾來指定哪些信號要連接到給定插槽,但這是要創建一個插槽。插槽來自「現成」課程該怎麼辦?是唯一的選項繼承它,然後用正確的裝飾器重新實現給定的插槽?

回答

16

在瀏覽相關問題時,我發現this answer正是我所需要的。用於連接只QButtonGroup的buttonClicked(INT)信號QBitArray的toggleBit(INT),忽視了其他重載的簽名,包括指定括號內的所需類型,這樣正確的新型信號語法:

self.buttonGroup.buttonClicked[int].connect(self.bitArray.toggleBit)