- 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
Neste artigo vou apresentar as widgets QCheckBox e QRadioButtun. Estas widgets geralmente são usadas para selecionar opções ou configurar características em um aplicativo, diferindo apenas quanto a múltipla seleção, possível epenas em grupos de QCheckBox.
Obviamente, o seu uso deve respeitar a sua forma de seleção. Por exemplo, considere um diálogo para pesquisar o tipo de filmes de interesse de um usuário. Este tipo de seleção pode ter múltiplas escolhas, e por isto deve ser feita com a widget QCheckBox.
Em um segundo diálogo onde se deseja que o usuário escolha um navegador padrão para o seu sistema, apenas um navegador deve ser selecionado como o padrão. Ai a widget adequada é a QRadioButton para o serviço.
QCheckBox: Sinais
Além de herdar os sinais da classe QAbstractButton (veja a descrição dos sinais no artigo anterior: PyQt 09 – QPushButton, apertando os botões, o QCheckBox possui ainda o sinal exclusivo, descrito na tabela abaixo:
[TABLE=26]
O inteiro de retorno do método acima é 2 (Qt.Checked), se o CheckBox for checado, e 0 (Qt.Unchecked) em caso contrário. Outro retorno possível é o 1 (Qt.PartiallyChecked), quando um item é parcialmente checado, usado em itens em modelos hierárquicos, como a seleção de alguns subdiretórios, arquivos em uma pasta. a tabela a seguir apresenta estes valores:
[TABLE=30]
O código abaixo gera uma mensagem simples para cada CheckBox clicado, no diálogo de seleção apresentado acima.
#!/bin/env python
# -*- coding: iso-8859-1 -*-
#
# por Rudson R. Alves
#
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from Dialogo_TiposdeFilmes import *
class CheckBoxDialog(QDialog, Ui_Dialog_TiposFilmes):
def __init__(self, parent = None):
super(CheckBoxDialog, self).__init__(parent)
self.setupUi(self)
@pyqtSignature("int")
def on_checkBox_0_stateChanged(self, status):
print u'CheckBox %s status é:%d' % (self.checkBox_0.text(), status)
@pyqtSignature("int")
def on_checkBox_1_stateChanged(self, status):
print u'CheckBox %s status é:%d' % (self.checkBox_1.text(), status)
@pyqtSignature("int")
def on_checkBox_2_stateChanged(self, status):
print u'CheckBox %s status é:%d' % (self.checkBox_2.text(), status)
@pyqtSignature("int")
def on_checkBox_3_stateChanged(self, status):
print u'CheckBox %s status é:%d' % (self.checkBox_3.text(), status)
@pyqtSignature("int")
def on_checkBox_4_stateChanged(self, status):
print u'CheckBox %s status é:%d' % (self.checkBox_4.text(), status)
@pyqtSignature("int")
def on_checkBox_5_stateChanged(self, status):
print u'CheckBox %s status é:%d' % (self.checkBox_5.text(), status)
@pyqtSignature("int")
def on_checkBox_6_stateChanged(self, status):
print u'CheckBox %s status é:%d' % (self.checkBox_6.text(), status)
app = QApplication(sys.argv)
dlg = CheckBoxDialog()
dlg.exec_()
O código Python do diálogo e arquivo ui, criado pelo Qt Designer, podem ser baixados no arquivo pyqt-10.zip.
Selecionando e removendo a seleção de cada opção do diálogo criado, irá gerar a saída no console abaixo:
./qcheckbox-01 CheckBox Ação status é:2 CheckBox Ação status é:0 CheckBox Comédia status é:2 CheckBox Comédia status é:0 CheckBox Comédia Romântica status é:2 CheckBox Comédia Romântica status é:0 CheckBox Ficção status é:2 CheckBox Ficção status é:0 CheckBox Romance status é:2 CheckBox Romance status é:0 CheckBox Suspence status é:2 CheckBox Suspence status é:0 CheckBox Terror status é:2 CheckBox Terror status é:0
O código anterior não é dos mais inteligentes, embora dê conta do recado, é muito extenso para fazer tão pouco. Um código muito mais eficiente e elegante é apresentado a seguir:
#!/bin/env python
# -*- coding: iso-8859-1 -*-
#
# por Rudson R. Alves
#
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from Dialogo_TiposdeFilmes import *
class CheckBoxDialog(QDialog, Ui_Dialog_TiposFilmes):
def __init__(self, parent = None):
super(CheckBoxDialog, self).__init__(parent)
self.setupUi(self)
self.connect(self.checkBox_0, SIGNAL("stateChanged(int)"),self.CheckBox_stateChanged)
self.connect(self.checkBox_1, SIGNAL("stateChanged(int)"),self.CheckBox_stateChanged)
self.connect(self.checkBox_2, SIGNAL("stateChanged(int)"),self.CheckBox_stateChanged)
self.connect(self.checkBox_3, SIGNAL("stateChanged(int)"),self.CheckBox_stateChanged)
self.connect(self.checkBox_4, SIGNAL("stateChanged(int)"),self.CheckBox_stateChanged)
self.connect(self.checkBox_5, SIGNAL("stateChanged(int)"),self.CheckBox_stateChanged)
self.connect(self.checkBox_6, SIGNAL("stateChanged(int)"),self.CheckBox_stateChanged)
def CheckBox_stateChanged(self):
checkbox = self.sender()
print u'CheckBox %s status é:%s' % (checkbox.text(), checkbox.isChecked())
app = QApplication(sys.argv)
dlg = CheckBoxDialog()
dlg.exec_()
A ideia é bem simples, o segredo está em redirecionar os sinais stateChanged(int) dos diferentes QCheckBox para uma única função, CheckBox_stateChanged, linhas 18 a 24. O CheckBox selecionado é recuperado pela função sender(), que retorna a widget que disparou o sinal, para a variável checkbox, na linha 27.
Obs: Imaginei que a função sender() fosse herdada de uma classe como QWidget, ou fizesse parte do escopo das classes QDialogo, QMainWindow, entre outras. No entanto não o encontrei. Se alguém tiver alguma informação, ela poderia ser bem instrutiva aqui.
QRadioButton: Sinais
O widget QRadioButton não possui nenhum sinal específico, herdando todos os sinais necessários ao seu funcionamento da classe QAbstractButton, que, como dito anteriormente, já foram apresentados no artigo anterior: PyQt 09 – QPushButton, apertando os botões.
O código a seguir mostra o funcionamento do diálogo com os QPushButton, mostrado no início deste texto, usando os mesmos princípios do código anterior.
#!/bin/env python
# -*- coding: iso-8859-1 -*-
#
# por Rudson R. Alves
#
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from Dialogo_Navegador import *
class CheckBoxDialog(QDialog, Ui_Dialog_Navegador):
def __init__(self, parent = None):
super(CheckBoxDialog, self).__init__(parent)
self.setupUi(self)
self.connect(self.radioButton_0, SIGNAL("clicked(bool)"),self.RadioButton_clicked)
self.connect(self.radioButton_1, SIGNAL("clicked(bool)"),self.RadioButton_clicked)
self.connect(self.radioButton_2, SIGNAL("clicked(bool)"),self.RadioButton_clicked)
self.connect(self.radioButton_3, SIGNAL("clicked(bool)"),self.RadioButton_clicked)
self.connect(self.radioButton_4, SIGNAL("clicked(bool)"),self.RadioButton_clicked)
def RadioButton_clicked(self):
radiobutton = self.sender()
print u'RadioButton %s status foi selecionado' % radiobutton.text()
app = QApplication(sys.argv)
dlg = CheckBoxDialog()
dlg.exec_()
A principal diferença entre este código e o anterior, está no sinal utilizado para checar o item selecionado no diálogo, que neste último foi o sinal “clicked()”.
Embora seja bem funcional, não é de praxe fazer o código desta forma. QCheckBoxs geralmente são agrupados em grupos definidos pela classe QButtonGroup ou QGroupBox. Mesmo os QCheckBox e os QPushButton podem ser agrupados assim. Mas isto fica para o próximo texto.
Cara muito show de bola ….
Muito útil parabéns
abraços
Valeu
Não sei porque mais comigo não funcionou o self.checkBox_3.text() então eu fiz assim:
if self.ui.checkboxAlarms.isChecked():
alarms = 1
else:
alarms = 0
é bem mais código mas foi a única maneira que achei de usar o bool no sqlite, pois o isChecked() retorna true e false de acordo com o estado do checkbox.