PyQt 09 – QPushButton, apertando os botões

Março 13th, 2010 by rudsonalves Leave a reply »

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.

Tab 01: Sinais do QAbstractButton

Sinal Descrição
clicked(bool) este sinal é emitido quando o botão é ativado, quando sua shortcut é pressionada ou quando os slots click() ou animateClick() são chamados
pressed() este sinal é emitido quando o botão é pressionado
released() este sianl é emitido quando o botão é liberado
toggled(bool) este sinal é emitido sempre que um botão checkable muda o seu estado, retornando um booleano para o seu estado

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:

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
#!/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:

31
32
33
34
35
  @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.

Advertisement

Deixe uma resposta