2012-06-23 18 views
6

Sto progettando un widget personalizzato che è fondamentalmente un QGroupBox in possesso di un numero configurabile di QCheckBox pulsanti, dove ognuno di loro dovrebbe controllare un po 'particolare in una maschera di bit rappresentato da un QBitArray. Per fare questo, ho aggiunto il QCheckBox casi ad un QButtonGroup, con ogni pulsante dato un ID intero:Collegamento di un segnale PyQT sovraccarico utilizzando il nuovo stile di sintassi

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) 

Poi, ogni volta che un utente dovrebbe fare clic su una casella di controllo contenuta nel self.buttonGroup , Mi piacerebbe che self.bitArray venga notificato in modo che il bit corrispondente nell'array possa essere impostato/disinserito di conseguenza. Per questo si intendeva connettersi di QButtonGroupButtonClicked (int) segnale di QBitArraytoggleBit (int) metodo e, per essere il più pythonic possibile, ho voluto usare sintassi segnali nuovo stile, così ho provato questo :

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

il problema è che ButtonClicked è un segnale di sovraccarico, per cui v'è anche la ButtonClicked (QAbstractButton *) firma . Infatti, quando il programma è in esecuzione ottengo questo errore quando clicco una casella di controllo:

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

che mostra chiaramente la toggleBit metodo ha ricevuto il ButtonClicked (QAbstractButton *) segnale al posto del ButtonClicked (int) uno.

Quindi, la domanda è: come posso specificare il collegamento del segnale, utilizzando la sintassi new-style, in modo che self.bitArray riceve il ButtonClicked (int) segnale al posto del sovraccarico di default - ButtonClicked (QAbstractButton *)?

EDIT: Il PyQT's New-style Signal and Slot Support documentation afferma è possibile utilizzare pyqtSlot decoratori per specificare quale segnale si desidera connettersi ad un dato di slot, ma che è per uno slot che si sta creando. Cosa fare quando lo slot proviene da una classe "ready made"? L'unica opzione è quella di suddividerla e quindi di reimplementare lo slot con il decoratore giusto?

risposta

16

Durante la ricerca di domande correlate, ho trovato this answer esattamente ciò di cui avevo bisogno. La sintassi del segnale new-style corretta per il collegamento solo di QButtonGroupButtonClicked (int) segnale di QBitArraytoggleBit (int), ignorando le altre firme sovraccarichi, coinvolge specificando il tipo desiderato tra parentesi, in questo modo:

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