Sinais e slots PyQt

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:

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 QObjectclasse podem enviar e receber sinais. Quase todas as classes no PyQt são subclasses da QObjectclasse.

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 clickedmensagem 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 QPushButtonwidget:

button = QPushButton('Click me')Linguagem de código:  Python  ( python )

Segundo, conecte o clickedsinal ao on_clickedmé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_clickedque imprima a mensagem clicada no terminal:

def on_clicked(self):
    print('clicked')Linguagem de código:  Python  ( python )

Ao clicar no botão, o QPushButtonemite 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 textChangedsinal do QLineEditpossui o texto inserido no widget.

Se um sinal transportar dados, o slot conectado poderá recebê-los.

O programa a seguir mostra QLineEdite QLabelwidgets. Quando você digita algo no QLineEdit, ele QLabelserá 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 QLabelwidget. O QLabelwidget possui o setText()método que define seu conteúdo.

label = QLabel()Linguagem de código:  Python  ( python )

Segundo, crie um novo QLineEditwidget:

line_edit = QLineEdit()Linguagem de código:  Python  ( python )

Terceiro, conecte o textChangedsinal ao setTextmétodo do QLabelobjeto:

line_edit.textChanged.connect(label.setText)Linguagem de código:  Python  ( python )

Quando você digita algo no QLineEdit:

  • O textChangedsinal envia o texto
  • O QLabelrecebe o texto e o passa para o setText()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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *