Este artigo é a parte 2 de 14 na série PyQt

Neste segundo artigo, vou montar a estrutura básica de um programa PyQt. Esta estrutura será replicada em praticamente todos os aplicativos de agora em diante.

Nestes primeiros artigos, não vou usar nenhuma ferramenta gráfica para montar as GUI (Graphical User Interface), por isto será necessário um pouco de atenção na leitura dos códigos para não perder a lógica de sua estrutura. Este momento é muito importante, pois facilita compreender melhor o funcionamento da biblioteca Qt. Mais adiante irei criar as GUIs com o auxílio do designer, uma IDE bem funcional para auxiliar na construção das GUIs, que é distribuída juntamente com a biblioteca Qt, ou seja, sem a necessitando de instalação de outros aplicativos/bibliotecas adicionais.

Uma caixa de mensagem simples

A ideia aqui é criar um dialogo simples, que apresentará uma mensagem. Inicialmente este dialogo não terá nenhum botão, apenas a mensagem. Mas antes, dê uma olhada no código básico do aplicativo, apresentado na listagem abaixo:

#!/usr/bin/env python                 
# -*- coding: iso-8859-1 -*-          
#                                     
# Simples Diálogo em PyQt4
#
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class Form(QDialog):

    def __init__(self, parent=None):
        super(Form, self).__init__(parent)

        #...


if __name__ == "__main__":
    # cria o objeto aplicativo
    app = QApplication(sys.argv)
    # cria o dialogo
    dlg = Form()
    # executa o dialogo
    dlg.exec_()

Este código possui a estrutura básica do que seria um dialogo em PyQt. O código inicia como no “Hello World”, carregando os módulos PyQt4.QtCore e PyQt4.QtGui, além do módulo sys, necessário para transmitir os parâmetros de linha de comando para o aplicativo, como feito na linha 20.

A declaração de classe Form, na linha 10, herda os métodos e atributos da classe QDialog, já que o aplicativo será um simples diálogo.

A linha 12, define o método __init__ do diálogo. É algo como o construtor do objeto Form, onde será declarado todos os comandos para montar o diálogo. Este método aceita como entrada a variável parent. Isto é necessário para dar mais funcionalidades ao diálogo, visto que ele pode ser chamado de dentro de outro aplicativo “Pai”. O comando super inicia o diálogo/aplicativo “Pai”, caso este exista.

Na linha 15 virá o código para a construção da estrutura interna do diálogo. A linha 18 não é fundamental, mas ela também prepara o código para ser carregado por outros aplicativos, como um módulo. As linhas 19 em diante, serão carregadas apenas se o diálogo for executado e não carregado como módulo.

Como no aplicativo “Hello World”, a linha 20 é o primeiro comando para iniciar o seu aplicativo. O QApplication contém o loop principal do aplicativo, onde os eventos do seu diálogo e outras ações serão processadas.

A linha 22 cria o diálogo, instanciando a classe Form, com seus botões, menus, … Por fim, a linha 24, irá iniciar o diálogo.

Na forma como está, será gerado uma janela vazia, com suas funcionalidades básicas, como escape para sair e o botão “x”, no canto superior direito do diálogo, também para sair do aplicativo.

Agora adicione um label e um botão ao diálogo, adicionando as linhas abaixo:

#!/usr/bin/env python    
# -*- coding: iso-8859-1 -*-
#                           
# Simples Diálogo em PyQt4
#                                  
import sys                         
from PyQt4.QtCore import *         
from PyQt4.QtGui import *          
                                     
class Form(QDialog):               
                                     
    def __init__(self, parent=None):
        super(Form, self).__init__(parent)
                                            
        # criar um label e o botão close_button
        label = QLabel("Tecle em close para fechar")
        close_button = QPushButton("&Close")       
                                                      
        # criar uma caixa de layout vertical, para  
        # organizar os elementos                    
        vbox = QVBoxLayout()                        
                                                      
        # adicionar os elementos a vbox             
        vbox.addWidget(label)                       
        vbox.addWidget(close_button)

        # adicionar a vbox ao diálogo
        self.setLayout(vbox)

        # conecta o evento click do botão close ao
        # slot reject(), saída do aplicativo
        self.connect(close_button, SIGNAL("clicked()"),
                self, SLOT("reject()"))

        # muda o título da janela
        self.setWindowTitle("Dialog - 01")


if __name__ == "__main__":
    # cria o objeto aplicativo
    app = QApplication(sys.argv)
    # cria o dialogo
    dlg = Form()
    # executa o dialogo
    dlg.exec_()

Apenas as linhas 16 a 36 foram de fato adicionadas ao código anterior, por isto vou me ater a descrevê-las apenas.

As linhas 16 e 17 criam um label e um botão close_button. O label é uma instância da classe QLabel, que já foi utilizada no “Hello World”, do artigo anterior. A novidade aqui é a classe QPushButton, utilizada para instanciar um botão com o texto “Close”. O “&” à frente do caractere “C”, indica a criação do atalho “Alt+C”, para ativar o evento clicked do botão close_button.

A linha 21 cria uma caixa de layout vertical, que chamei de vbox, instanciando a classe QVBoxLayout. Esta caixa, a vbox, serve para empilhar outros objetos como o label e o close_button, organizando-os verticalmente, na ordem em que são adicionados à esta caixa pelo método addWidget. Este empilhamento é feito nas linhas seguintes, 24 e 25.

Na linha 28, a vbox, com o label e o close_button, são adicionados ao diálogo, com o uso do método setLayout. Observe que este método é herdado da classe QDialog, que por sua vez herda de outras classes.

A linha 32, parece um pouco complicada, mas não chega a tando. Ela utiliza o método connect para conectar, do botão cancel_button, o sinal clicked() (pressionar o botão), ao SLOT reject() do diálogo, self. O SLOT reject(), esconde o diálogo e envia um sinal reject() ao aplicativo, que o encerra.

self.connect(cancel_button, SIGNAL("clicked()"), self, SLOT("reject()"))

A última linha, 36, apenas altera o título do diálogo para “Dialog – 01”, com o uso do método setWindowTitle

A figura abaixo mostra o resultado do diálogo criado pelas linhas acima. Tive que estender horizontalmente um pouco a caixa de diálogo, para que o título aparecesse por inteiro.

pyqt-03

Considerações finais

Neste segundo artigo, passei a introduzir no texto vários links direto para a documentação do Qt. É muito importante que se habitue a consultar as páginas de documentação, pois não existe tutorial que apresente a todos os métodos e atributos da Qt.

Código

  • hello – código do “Hello World”
  • msg-01 – código do diálogo apresentado neste texto.
  • message – uma caixa de mensagem um pouco mais útil