Julho 17, 2009 at 12:04 pm

PyQt 03 – Diálogos com QMessageBox

Este artigo é a parte 3 de 13 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:

Tipo Ícone Descrição
question dialog-question para questionamentos, geralmente acompanhado de botões “Yes” e “No”, ou outras combinações como “Ok” e “Cancel”, …
information dialog-information usado para apresentar simples caixas de diálogo, geralmente, com apenas o botão “Ok”
warning dialog-warning usado para levar mensagens de alerta ao usuário
critical dialog-critical usado para comunicar ações críticas do aplicativo

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:

Constante Valor Descrição
QMessageBox.Ok 0×00000400 Botão “OK” definido com o AcceptRole
QMessageBox.Open 0×00002000 Botão “Open” definido com o AcceptRole
QMessageBox.Save 0×00000800 Botão “Save” definido com o AcceptRole
QMessageBox.Cancel 0×00400000 Botão “Cancel” definido com o AcceptRole
QMessageBox.Close 0×00200000 Botão “Close” definido com o RejectRole
QMessageBox.Discard 0×00800000 Botão “Discard” ou “Don’t Save”, dependendo da plataforma, definido com o DestructiveRole
QMessageBox.Apply 0×02000000 Botão “Apply” definido com o ApplyRole
QMessageBox.Reset 0×04000000 Botão “Reset” definodo com o ResetRole
QMessageBox.RestoreDefaults 0×08000000 Botão “Restore Defaults” definodo com o ResetRole
QMessageBox.Help 0×01000000 Botão “Help” definido com o HelpRole
QMessageBox.SaveAll 0×00001000 Botão “Save All” definido com o AcceptRole
QMessageBox.Yes 0×00004000 Botão “Yes” definido com o YesRole.
QMessageBox.YesToAll 0×00008000 Botão “Yes to All” definido com o YesRole
QMessageBox.No 0×00010000 Botão “No” definido com o NoRole
QMessageBox.NoToAll 0×00020000 Botão “No to All” definido com o NoRole
QMessageBox.Abort 0×00040000 Botão “Abort” definido com o RejectRole
QMessageBox.Retry 0×00080000 Botão “Retry” definido com o AcceptRole
QMessageBox.Ignore 0×00100000 Botão “Ignore” definido com o AcceptRole
QMessageBox.NoButton 0×00000000 Botão inválido

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:

Constante Valor Descrição
QMessageBox.Ok 0×00000400 Botão “OK” definido com o AcceptRole
QMessageBox.Open 0×00002000 Botão “Open” definido com o AcceptRole
QMessageBox.Save 0×00000800 Botão “Save” definido com o AcceptRole
QMessageBox.Cancel 0×00400000 Botão “Cancel” definido com o AcceptRole
QMessageBox.Close 0×00200000 Botão “Close” definido com o RejectRole
QMessageBox.Discard 0×00800000 Botão “Discard” ou “Don’t Save”, dependendo da plataforma, definido com o DestructiveRole
QMessageBox.Apply 0×02000000 Botão “Apply” definido com o ApplyRole
QMessageBox.Reset 0×04000000 Botão “Reset” definodo com o ResetRole
QMessageBox.RestoreDefaults 0×08000000 Botão “Restore Defaults” definodo com o ResetRole
QMessageBox.Help 0×01000000 Botão “Help” definido com o HelpRole
QMessageBox.SaveAll 0×00001000 Botão “Save All” definido com o AcceptRole
QMessageBox.Yes 0×00004000 Botão “Yes” definido com o YesRole.
QMessageBox.YesToAll 0×00008000 Botão “Yes to All” definido com o YesRole
QMessageBox.No 0×00010000 Botão “No” definido com o NoRole
QMessageBox.NoToAll 0×00020000 Botão “No to All” definido com o NoRole
QMessageBox.Abort 0×00040000 Botão “Abort” definido com o RejectRole
QMessageBox.Retry 0×00080000 Botão “Retry” definido com o AcceptRole
QMessageBox.Ignore 0×00100000 Botão “Ignore” definido com o AcceptRole
QMessageBox.NoButton 0×00000000 Botão inválido

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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/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

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

4 comments so far

  1. Jonnathan

    Junho 4th, 2010 at 11:40 pm

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

  2. rudsonalves

    Junho 5th, 2010 at 10:49 pm

    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

    Setembro 26th, 2010 at 12:05 am

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

  4. Rodrigo Haas

    Setembro 26th, 2010 at 12:07 am

    ex: u”alguma string”

2 Trackbacks/Pings

  1. PyQt: 02 – Criando uma caixa de mensagem » a bit of… Out 03 2009 at 10am:

    [...] Próximo > PyQt: 03 – Diálogos com QMessageBox [...]

  2. PyQt: 04 – Diálogos com QInputDialog » a bit of… Out 03 2009 at 10am:

    [...] Anterior >PyQt: 03 – Diálogos com QMessageBox [...]

Leave a reply

Spam Protection by WP-SpamFree

Back to top