PyQt: señales y ranuras

A diferencia de una aplicación en modo de consola, que se ejecuta de manera secuencial, una aplicación basada en GUI está impulsada por eventos. Las funciones o métodos se ejecutan en respuesta a las acciones del usuario, como hacer clic en un botón, seleccionar un elemento de una colección o un clic del mouse, etc., llamadoevents.

Los widgets que se utilizan para construir la interfaz GUI actúan como fuente de tales eventos. Cada widget de PyQt, que se deriva de la clase QObject, está diseñado para emitir 'signal'en respuesta a uno o más eventos. La señal por sí sola no realiza ninguna acción. En cambio, está 'conectado' a un 'slot'. La ranura puede ser cualquieracallable Python function.

En PyQt, la conexión entre una señal y una ranura se puede lograr de diferentes maneras. A continuación se muestran las técnicas más utilizadas:

QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)

Una forma más conveniente de llamar a slot_function, cuando un widget emite una señal, es la siguiente:

widget.signal.connect(slot_function)

Supongamos que se va a llamar a una función cuando se hace clic en un botón. Aquí, la señal pulsada se conectará a una función invocable. Se puede lograr en cualquiera de las siguientes dos técnicas:

QtCore.QObject.connect(button, QtCore.SIGNAL(“clicked()”), slot_function)

o

button.clicked.connect(slot_function)

Ejemplo

En el siguiente ejemplo, se agregan dos objetos QPushButton (b1 y b2) en la ventana QDialog. Queremos llamar a las funciones b1_clicked () y b2_clicked () al hacer clic en b1 y b2 respectivamente.

Cuando se hace clic en b1, la señal de clic () se conecta a la función b1_clicked ()

b1.clicked.connect(b1_clicked())

Cuando se hace clic en b2, la señal de clic () se conecta a la función b2_clicked ()

QObject.connect(b2, SIGNAL("clicked()"), b2_clicked)

Ejemplo

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def window():
   app = QApplication(sys.argv)
   win = QDialog()
   b1 = QPushButton(win)
   b1.setText("Button1")
   b1.move(50,20)
   b1.clicked.connect(b1_clicked)

   b2 = QPushButton(win)
   b2.setText("Button2")
   b2.move(50,50)
   QObject.connect(b2,SIGNAL("clicked()"),b2_clicked)

   win.setGeometry(100,100,200,100)
   win.setWindowTitle("PyQt")
   win.show()
   sys.exit(app.exec_())

def b1_clicked():
   print "Button 1 clicked"

def b2_clicked():
   print "Button 2 clicked"

if __name__ == '__main__':
   window()

El código anterior produce la siguiente salida:

Salida

Button 1 clicked
Button 2 clicked