- PyQt 01 – O Primeiro Programa
- PyQt 02 – Criando uma caixa de mensagem
- PyQt 03 – Diálogos com QMessageBox
- PyQt 04 – Diálogos com QInputDialog
- PyQt 05 – Diálogo QFileDialog
- PyQt 06 – Mais diálogos
- PyQt 07 – QLabel e Qt Designer
- PyQt 08 – QLineEdit e mais Qt Designer
- PyQt 09 – QPushButton, apertando os botões
- PyQt 10 – QCheckBox e QRadioButton: checando as opções
- PyQt 11 – QButtonGroup e QGroupBox: mais opções
- PyQt 12 – QComboBox
- PyQt 13 – QSpinBox, QProgressBar e + sinais
- PyQt 14 – QNetwork, baixando arquivos
A próxima widget a ser apresentada é a QPushButton, os tradicionais botões nos aplicativos gráficos e um dos mais usados widgets em aplicativos gráficos. Seguindo o mesmo estilo dos textos anteriores vou apresentar alguns aplicativos simples, onde os sinais e slots desta widget poderão ser explorados.
Sinais herdados…
Diferente dos widgets apresentados aqui, o QPushButtion não possui nenhum sinal específico, herdando todos os sinais da classe QAbstractButton. Esta classe é uma abstração para widgets com sinais semelhantes como QCheckBox, QRadioButton, QToolButton, além da QPushButton. A herança da widget QPushButton é apresentada a seguir:
QPushButton -> QAbstractButton -> QWidget -> QObject e QPaintDevice
Num outro momento vou explorar os sinais das heranças mais internas, mas no momento vou me preocupar com as heranças mais fundamentais, diretamente relevantes para a widget em questão.
[TABLE=25]
Testando os sinais
Para testar este sinais proponho um diálogo bem simples, com quatro botões, nomeados clicked_pushButton, pressed_pushButton, released_pushButton e toggled_pushButton, cada qual respondendo a um sinal diferente. O diálogo fica com a forma apresentada na figura abaixo:
Os textos dos botões foram alterados para indicarem seu nome e no último botão, toggled_pushButton, o atributo checkable foi alterado para True, para mudar o seu comportamento. A interface do diálogo (GUI) foi criada com o QT Designer, como pretendo fazer em todas os próximos exemplos apresentar. O código e o ui para este exemplo podem ser baixados do link pyqt-09.
O código para este diálogo é apresentado a seguir:
#!/bin/env python
#-*- coding: iso-8859-1 -*-
#
# Diálogo demonstrativo dos sinais dos botões
# por Rudson R. Alves
# 13 de março 2010
#
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from buttons import *
class buttons_Dialog(QDialog, Ui_buttonsDialog):
def __init__(self, parent = None):
super(buttons_Dialog, self).__init__(parent)
self.setupUi(self)
@pyqtSignature("bool")
def on_clicked_pushButton_clicked(self, status):
print "O botão clicked_pushButton foi pressionado (%s)" % str(status)
@pyqtSignature("")
def on_pressed_pushButton_pressed(self):
print "O botão pressed_pushButton foi pressionado..."
@pyqtSignature("")
def on_released_pushButton_released(self):
print "O botão released_pushButton foi liberado..."
@pyqtSignature("bool")
def on_toggled_pushButton_toggled(self, status):
print "O botão toggled_pushButton foi pressionado. Seu status é %s" % \
str(status)
app = QApplication(sys.argv)
dlg = buttons_Dialog()
dlg.exec_()
O código apenas coleta diferentes sinais e imprime uma mensagem correspondente. Algumas fatos interessantes podem ser observados na resposta deste aplicativo. A primeira delas é que os sinais clicked, released e toggled, são emitidos somente quando o botão é liberado. Portando, apenas o sinal pressed, linha 24, responde no momento em que o botão é pressionando, como pode ser observado ao se pressionar o botão pressed_pushButton.
Da forma que foi implementado, a variável status, retornado pelo sinal clicked do botão clicked_pushButton, linha 20, apresenta sempre o mesmo valor, False. Isto acontece porque o atributo checkable está desabilitado. Adicione a linha 35, conforme mostra o trecho de código abaixo:
@pyqtSignature("bool")
def on_toggled_pushButton_toggled(self, status):
print "O botão toggled_pushButton foi pressionado. Seu status é %s" % \
str(status)
self.clicked_pushButton.setCheckable(status)
Execute novamente o diálogo e observe que o status em on_clicked_pushButton_clicked muda de valor a cada click no botão clicked_pushButton, sempre que o botão toggled_pushButton estiver no estado down (baixado). Isto acontece pois o status do botão toggled_pushButton é usado para mudar status da propriedade checkable do botão clicked_pushButton na nova linha 35.