PyQt - Sinais e Slots

Ao contrário de um aplicativo de modo de console, que é executado de maneira sequencial, um aplicativo baseado em GUI é orientado a eventos. Funções ou métodos são executados em resposta às ações do usuário, como clicar em um botão, selecionar um item de uma coleção ou clicar com o mouse etc., chamadosevents.

Os widgets usados ​​para construir a interface GUI agem como a fonte de tais eventos. Cada widget PyQt, que é derivado da classe QObject, é projetado para emitir 'signal'em resposta a um ou mais eventos. O sinal sozinho não executa nenhuma ação. Em vez disso, ele está 'conectado' a um 'slot'. O slot pode ser qualquercallable Python function.

No PyQt, a conexão entre um sinal e um slot pode ser realizada de diferentes maneiras. A seguir estão as técnicas mais comumente usadas -

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

Uma maneira mais conveniente de chamar um slot_function, quando um sinal é emitido por um widget, é a seguinte -

widget.signal.connect(slot_function)

Suponha que uma função deva ser chamada quando um botão é clicado. Aqui, o sinal clicado deve ser conectado a uma função chamável. Isso pode ser alcançado em qualquer uma das seguintes técnicas -

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

ou

button.clicked.connect(slot_function)

Exemplo

No exemplo a seguir, dois objetos QPushButton (b1 e b2) são adicionados na janela QDialog. Queremos chamar as funções b1_clicked () e b2_clicked () clicando em b1 e b2 respectivamente.

Quando b1 é clicado, o sinal clicked () é conectado à função b1_clicked ()

b1.clicked.connect(b1_clicked())

Quando b2 é clicado, o sinal clicked () é conectado à função b2_clicked ()

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

Exemplo

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()

O código acima produz a seguinte saída -

Resultado

Button 1 clicked
Button 2 clicked