PyQt 03 – Diálogos com QMessageBox

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

O PyQt possui várias classes especiais para gerar caixas de diálogos simples e versáteis. Neste texto vou aborda uma destas classes: a QMessageBox.

1. A classe QMessageBox

A classe QMessageBox produz um diálogo bastante flexível, que lhe permite apresentar uma informação, fazer uma pergunta, alertar e recolher respostas para questões relevantes em seu programa.

Para um teste rápido desta classe, abra o interpretador Python, carregue o módulo PyQt4.QtGui, como de praxe, e em seguida instancie um aplicativo, passando como argumento uma lista vazia, como mostra os comandos abaixo:

>>> from PyQt4.QtGui import *
>>> app = QApplication([])

1.1. Sintaxe do QMessageBox

Isto já é suficiente para executar uma caixa de mensagem. Mas antes de abrir a primeira caixa de mensagem, vamos dar uma olhada na sintaxe do QMessageBox a seguir:

msg = QMessageBox.tipo(parent, title, text,  
                         button0, button1, button2, ...)

O tipo pode ser:

[TABLE=5]

Essencialmente, o tipo apenas adiciona o ícone relativo ao diálogo. Parent é o widget pai, que na definição de uma classe, referencia ela própria (self), em linha de comando não é filha de ninguém, None. O title deve conter a string que aparecerá como título da janela e text, o texto com a questão a ser respondida pelo usuário. Os botões button0, button1, … podem ser separados por vírgula, como na linha acima ou separados pelo operador ou “|”, como abaixo:

msg = QMessageBox.tipo(parent, title, text, 
                         button0|button1|button2|...)

esta última sintaxe é a mais usada pelos programadores PyQt. Os botões são constantes numéricas, definidas em PyQt4.QtGui, com os valores apresentados na tabela a seguir:

[TABLE=6]

1.2. Alguns Exemplos

O diálogo padrão criado pelo QMessageBox, possui apenas o botão “OK”, independente do tipo especificado, como pode ser visto na linha a seguir:

>>> dlg = QMessageBox(None)
>>> dlg.setWindowTitle("Message Box")
>>> dlg.setIcon(QMessageBox.Question)
>>> dlg.setText("Este é o dialogo padrão do QMessageBox, com apenas um botão OK")
>>> dlg.exec_()

O primeiro comando instancia o diálogo dlg, o segundo, configura o título do diálogo, em seguida define a mensagem a ser apresentada e por fim apresenta o diálogo. Isto irá gerar um diálogo como o da figura abaixo:

dialog-01

O mesmo pode ser feito em uma única linha de comando, como mostra a linha abaixo:

>>> QMessageBox.question(None, "MessageBox", \
"Este é o dialogo padrão do QMessageBox, com apenas um botão OK")

com uma pequena diferença, no primeiro diálogo, dlg é uma instância do objeto QMessageBox. Em ambos os comandos, o retorno é o código do botão pressionando, 1024.

1.3. Adicionando botões

Os botões padrões são apresentados na tabela a seguir:

[TABLE=6]

Os exemplos a seguir adicionam os botões “Yes”, “No” e “Cancel” ao diálogo:

>>> dlg = QMessageBox(None)
>>> dlg.setWindowTitle("Message Box")
>>> dlg.setIcon(QMessageBox.Critical)
>>> dlg.setText("Isto é uma mensagem crítica. Deseja continuar?")
>>> dlg.setStandardButtons(QMessageBox.Yes|QMessageBox.No|QMessageBox.Cancel)
>>> resp = dlg.exec_()

aqui em uma linha:

>>> resp = QMessageBox.critical(None, "Message Box", \
"Isto é uma mensagem crítica. Deseja continuar?",  \
QMessageBox.Yes|QMessageBox.No|QMessageBox.Cancel)

O diálogo gerado é apresentado na figura a seguir.

dialog-02

1.4. Usando o QMessageBox

O programa a seguir cria um diálogo para apresentar as quatro caixas de diálogo.

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
#
# Simples Hello World em Python+Qt4
#
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
        label = QLabel("Selecione um dos botões abaixo\npara abrir o diálogo desejado")

        # cria os botões
        question_button = QPushButton("&Question")
        information_button = QPushButton("&Information")
        warning_button = QPushButton("&Warning")
        critical_button = QPushButton("C&ritical")
        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(question_button)
        vbox.addWidget(information_button)
        vbox.addWidget(warning_button)
        vbox.addWidget(critical_button)

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

        # conecta os botões às devidas funções
        self.connect(question_button, SIGNAL("clicked()"),
                self.question_button_clicked)
        self.connect(information_button, SIGNAL("clicked()"),
                self.information_button_clicked)
        self.connect(warning_button, SIGNAL("clicked()"),
                self.warning_button_clicked)
        self.connect(critical_button, SIGNAL("clicked()"),
                self.critical_button_clicked)

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

    def question_button_clicked(self):
        print "Question pressed..."
        msg = QMessageBox.question(self, "QMessageBox",
                "Isto é uma questão...", QMessageBox.Yes|QMessageBox.No)

    def information_button_clicked(self):
        print "Information pressed..."
        msg = QMessageBox.information(self, "QMessageBox",
                "Isto é uma informação...", QMessageBox.Close)

    def warning_button_clicked(self):
        print "Warning pressed..."
        msg = QMessageBox.warning(self, "QMessageBox",
                "Isto é um warning...", QMessageBox.Close)

    def critical_button_clicked(self):
        print "Critical pressed..."
        msg = QMessageBox.critical(self, "QMessageBox", \
                "Isto é um critical...", \
                QMessageBox.Apply|QMessageBox.Reset|QMessageBox.Close)

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

A figura a seguir mostra o aplicativo em ação.

dialog-03

Este post tem 7 comentários

  1. Jonnathan

    Gostaria de saber como faço para colocar acentuação. ele não esta reconhecendo!!

  2. rudsonalves

    O problema deve estar no seu encode. Experimente colocar

    # -*- coding: iso-8859-1 -*-

    no início do seu código, se tiver usado o encode iso-8859-1. O comando pyuic4 geralmente coloca o encode iso-utf-8, nos códigos gerados. Se tiver usado o iso-8859-1, deverá substituí-lo antes de executar o código. A linha a segui faz o trabalho para você:

    sed -i ‘s/utf\-8/iso\-8859\-1/’ Ui_nome-do-seu-gui.py

  3. Rodrigo Haas

    Se estiver usando Unicode (utf-8), ponha um ‘u’ antes da string, assim ela será interpretada como unicode.

  4. Rodrigo Haas

    ex: u”alguma string”

  5. Adriel

    Texto muito bom, deixou claro e tirou todas as minhas dúvidas, mesmo sendo um texto de 2010, valeu muito

Deixe um comentário

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.