2012-06-23 10 views
6

Estoy diseñando un widget personalizado que es básicamente una QGroupBox la celebración de un número configurable de QCheckBox botones, donde cada uno de ellos debe controlar un poco particular en una máscara de bits representado por un QBitArray. Con el fin de hacer eso, añadí la QCheckBox casos a un QButtonGroup, con cada botón dado un ID de número entero:Conexión de una señal de PyQt sobrecargada usando el nuevo estilo de sintaxis

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) 

Entonces, cada vez que un usuario podría hacer clic en una casilla de verificación contenida en self.buttonGroup , Me gustaría que notifique self.bitArray para que el bit correspondiente en la matriz se pueda establecer/desarmar en consecuencia. Para que tenía la intención de conectar de QButtonGroupbuttonClicked (int) señal a de QBitArraycomando ToggleBit (int) método y, de ser lo más Pythonic como sea posible, quería utilizar la sintaxis de las señales de estilo nuevo, así que probé este :

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

el problema es que buttonClicked es una señal de sobrecarga, por lo que también es la buttonClicked (QAbstractButton *) firma. De hecho, cuando el programa se está ejecutando consigo este error al hacer clic en una casilla de verificación:

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

lo que demuestra claramente la comando ToggleBit método recibió el buttonClicked (QAbstractButton *) señal en lugar de la buttonClicked (int) uno.

Entonces, la pregunta es, ¿cómo puedo especificar la conexión de la señal, utilizando la sintaxis de nuevo estilo, de manera que self.bitArray recibe la buttonClicked (int) señal en lugar de la sobrecarga por defecto - buttonClicked (QAbstractButton *)?

EDIT: El PyQT's New-style Signal and Slot Support documentation afirma que puede utilizar pyqtSlot decoradores para especificar qué señal que desea conectarse a una ranura dada, pero eso es para una ranura que está creando. ¿Qué hacer cuando la ranura es de una clase "lista para usar"? ¿La única opción es subclasificarla y luego volver a implementar la ranura dada con el decorador correcto?

Respuesta

16

Mientras navegaba por preguntas relacionadas encontré que this answer era exactamente lo que necesitaba. La sintaxis de la señal de nuevo estilo de conexión correcto solamente de QButtonGroupbuttonClicked (int) señal a de QBitArraycomando ToggleBit (int), haciendo caso omiso de las demás firmas sobrecargados, implica especificar el tipo deseado entre paréntesis, así:

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