Resumo : neste tutorial, você aprenderá sobre sinais e slots PyQt e como eles funcionam em aplicativos PyQt.
Introdução aos sinais e slots PyQT
Normalmente, um script Python é executado de cima para baixo da seguinte forma:
- Obtenha informações.
- Processe as entradas para produzir saídas.
- Grave as saídas na tela ou em um arquivo.
Isso é chamado de programação de procedimento .
Ao criar um programa GUI, você usa programação orientada a eventos . No paradigma de programação orientada a eventos, um programa tem o seguinte fluxo:
- Crie widgets como rótulos , edições de linha e botões .
- Inicie um loop de eventos que aguarda eventos.
- Responda aos eventos quando eles ocorrerem executando callables .
Observe que um callable é uma função , um método ou um objeto que implementa o __call__()
método.
Para conectar eventos com callables do programa, PyQt usa o mecanismo de sinais e slots .
Sinais
Um sinal é uma propriedade especial de um objeto que é emitida quando ocorre um evento. Um evento pode ser uma ação do usuário, um tempo limite ou a conclusão de uma operação assíncrona.
Caça-níqueis
Um slot é uma chamada que pode receber um sinal e responder a ele.
Para responder aos eventos, você conecta sinais aos slots. Quando você conecta um sinal a um slot, o slot será executado quando o sinal for emitido.
No PyQt, todas as subclasses da QObject
classe podem enviar e receber sinais. Quase todas as classes no PyQt são subclasses da QObject
classe.
Vamos dar um exemplo para entender como funciona o mecanismo de sinais e slots PyQt.
Exemplo de sinais e slots PyQt
O programa a seguir exibe uma janela que possui um botão. Ao clicar no botão, o programa mostra a clicked
mensagem no console:
import sys
from PyQt6.QtWidgets import (
QApplication,
QWidget,
QLineEdit,
QPushButton,
QVBoxLayout
)
class MainWindow(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# set the window title
self.setWindowTitle('Qt Signals & Slots')
# create a button widget and connect its clicked signal
# to a method
button = QPushButton('Click me')
button.clicked.connect(self.button_clicked)
# place the buton on window using a vertical box layout
layout = QVBoxLayout()
self.setLayout(layout)
layout.addWidget(button)
# show the window
self.show()
def button_clicked(self):
print('clicked')
if __name__ == '__main__':
app = QApplication(sys.argv)
# create the main window and display it
window = MainWindow()
# start the event loop
sys.exit(app.exec())
Linguagem de código: Python ( python )
Como funciona. (Vamos nos concentrar apenas nos sinais e slots)
Primeiro, crie um botão usando o QPushButton
widget:
button = QPushButton('Click me')
Linguagem de código: Python ( python )
Segundo, conecte o clicked
sinal ao on_clicked
método (slot):
button.clicked.connect(self.button_clicked)
Linguagem de código: Python ( python )
Em geral, a sintaxe para conectar um sinal a um slot é a seguinte:
sender_object.signal_name.connect(receiver_object.slot_name)
Linguagem de código: Python ( python )
Além disso, você pode conectar um sinal a um slot ao passar um slot para um sinal como argumento de palavra-chave. Por exemplo:
button = QPushButton('Click me', clicked=self.button_clicked)
Linguagem de código: Python ( python )
Terceiro, defina um método on_clicked
que imprima a mensagem clicada no terminal:
def on_clicked(self):
print('clicked')
Linguagem de código: Python ( python )
Ao clicar no botão, o QPushButton
emite o sinal clicado que executa o slot conectado on_clicked
.
Observe que o código a seguir coloca o botão na janela usando o layout de caixa vertical . E você aprenderá mais sobre isso no próximo tutorial.
layout = QVBoxLayout()
self.setLayout(layout)
layout.addWidget(button)
Linguagem de código: Python ( python )
Usando sinais que enviam dados
Um sinal pode transportar dados que fornecem o estado do objeto quando o evento ocorre. Por exemplo, o textChanged
sinal do QLineEdit
possui o texto inserido no widget.
Se um sinal transportar dados, o slot conectado poderá recebê-los.
O programa a seguir mostra QLineEdit
e QLabel
widgets. Quando você digita algo no QLineEdit
, ele QLabel
será exibido de acordo:
import sys
from PyQt6.QtWidgets import (
QApplication,
QWidget,
QLabel,
QLineEdit,
QVBoxLayout
)
class MainWindow(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setWindowTitle('Qt Signals & Slots')
# create widgets
label = QLabel()
line_edit = QLineEdit()
line_edit.textChanged.connect(label.setText)
# place the widgets
layout = QVBoxLayout()
layout.addWidget(label)
layout.addWidget(line_edit)
self.setLayout(layout)
# show the window
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec())
Linguagem de código: Python ( python )
Como funciona.
Primeiro, crie um QLabel
widget. O QLabel
widget possui o setText()
método que define seu conteúdo.
label = QLabel()
Linguagem de código: Python ( python )
Segundo, crie um novo QLineEdit
widget:
line_edit = QLineEdit()
Linguagem de código: Python ( python )
Terceiro, conecte o textChanged
sinal ao setText
método do QLabel
objeto:
line_edit.textChanged.connect(label.setText)
Linguagem de código: Python ( python )
Quando você digita algo no QLineEdit
:
- O
textChanged
sinal envia o texto - O
QLabel
recebe o texto e o passa para osetText()
método.
Resumo
- Um sinal é uma propriedade especial de um objeto que é emitida quando ocorre um evento.
- Um slot é uma chamada que pode receber um sinal e responder a ele de acordo.
- PyQt usa sinais e slots para conectar eventos com chamadas.