PyQt5 - 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, está 'conectado' a um‘slot’. O slot pode ser qualquercallable Python function.
Usando o Editor de Sinal / Slot do Qt Designer
Primeiro projete um formulário simples com um controle LineEdit e um PushButton.
Deseja-se que, se o botão for pressionado, o conteúdo da caixa de texto seja apagado. O widget QLineEdit possui um método clear () para esse propósito. Portanto, o botãoclicked sinal deve ser conectado a clear() método da caixa de texto.
Para começar, escolha Editar sinais / slots no menu Editar (ou pressione F4). Em seguida, destaque o botão com o mouse e arraste o cursor para a caixa de texto
Conforme o mouse é liberado, uma caixa de diálogo mostrando sinais de botão e métodos de slot será exibida. Selecione o sinal clicado e o método Clear ()
A janela Signal / Slot Editor no canto inferior direito mostrará o resultado -
Salve o ui e o código Build e Python do arquivo ui, conforme mostrado no código a seguir -
pyuic5 -x signalslot.ui -o signalslot.py
O código Python gerado terá a conexão entre o sinal e o slot pela seguinte instrução -
self.pushButton.clicked.connect(self.lineEdit.clear)
Execute sinaislot.py e insira algum texto no LineEdit. O texto será apagado se o botão for pressionado.
Conexão de slot de sinal de construção
Em vez de usar o Designer, você pode estabelecer diretamente a conexão de slot de sinal seguindo a sintaxe -
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 -
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 ().
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets 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)
b2.clicked.connect(b2_clicked)
win.setGeometry(100,100,200,100)
win.setWindowTitle("PyQt5")
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