PyQt 04 – Diálogos com QInputDialog

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

Este texto é mais uma abordagem de diálogos rápido, agora com o QInputDialog, uma classe que possui quatro funções estáticas bastante versáteis.

1. A classe QInputDialog

A classe QInputDialog permite gerar um diálogo simples para coletar valores do tipo string ou inteiro, que podem ser digitados ou selecionados por meio de uma lista.

Dependendo do tipo de entrada que se deseja capturar, pode ser acolhido um dos tipos de diálogo, fornecidos pelas funções abaixo:

[TABLE=7]

A sintaxe muda de acordo com o tipo de diálogo desejado.

Atenção: Este texto foi feito em cima do PyQt versão 4.4. Na versão 4.5 o nome da função getInteger() muda para getInt(). Referências: 4.4 e 4.5.

1.1. Entradas numérias

As entradas numéricas podem ser inteiro ou ponto flutuante. Ambas são feitas através de um diálogo com um QSpinBox, ou um QDoubleSbinBox.

Suas sintaxes são apresentadas na linha a seguir:

QInputDialog.getInteger (parent, title, label, value, min, max, step)

e

QInputDialog.getDouble (parent, title, label, value, min, max, decimals)

Parent e title tem o mesmo papel que em QMessageBox e label o de text em QMessageBox. Value contém o valor inicial do Spinbox. Os argumentos min e max deve conter os valores mínimo e máximo que o SpinBox pode assumir, respectivamente. Em setInteger(), o sétimo argumento contém o step, incremento, do SpinBox e no setDouble(), o número de dígitos após a vírgula.

Os valores padrões para os parâmetros value, min, max e step, são apresentados na tabela abaixo:

[TABLE=8]

Veja alguns exemplos de uso destes diálogos a seguir:

>>> dl = QInputDialog.getInteger(None, 'QinputDialog getInteger',
... 'Entre com o número de produtos:', 1, 0, 150, 5)
>>> print dl
(16, True)

dialog-06

O valor retornado em dl é uma tupla, com o valor selecionado no diálogo, no elemento 0, e o status (True para ok e False para Cancel) do botão selecionado, no elemento 1.

A próxima linha de código, faz um diálogo semelhante, mas agora com a função getDouble().

>>> dl = QInputDialog.getDouble(None, 'QinputDialog getDouble', \
... 'Entre com o custo do produto:', 5.58, 5.0, 15.0, 2)
>>> print dl
(12.0, True)

dialog-04

O retorno em dl difere apenas no tipo do elemento 0 da tupla, que agora é um número em ponto flutuante.

1.2. Entrada de texto

As próxima função estática gera um diálogo simples com uma entrada de texto. Sua sintaxe é apresentada abaixo:

QInputDialog.getText (parent, title, label, mode, text)

onde:

  • parent, title e label – são os mesmos descritos na seção anterior;
  • mode – é um dos modos apresentados na tabela a seguir;
  • text – contém o texto padrão da caixa de diálogo.

[TABLE=9]

As linhas abaixo apresentam o funcionamento desta função estática.

>>> dl = QInputDialog.getText(None,'getText - Normal', 
... "Entre com o seu nome completo", QLineEdit.Normal, 
... "Nome completo")

no modo Normal,

dialog-07

>>> dl = QInputDialog.getText(None,'getText - NoEcho', 
... "Entre com sua senha", QLineEdit.NoEcho, 
... "123456")

No modo NoEcho, nada aparece ao ser digitado a senha.

>>> dl = QInputDialog.getText(None,'getText - Password', 
... "Entre com sua senha", QLineEdit.Password, 
... "123456")

No modo Password, asteriscos serão apresentados a cada tecla pressionada.

>>> dl = QInputDialog.getText(None,'getText - PasswordEchoOnEdit', 
... "Entre com a sua senha", QLineEdit.PasswordEchoOnEdit, 
... "123456")

No modo PasswordEchoOnEdit a string “123456” irá aparecer como 6 asteriscos. Ao se pressionar alguma tecla os asteriscos desaparecem e as teclas pressionadas serão apresentadas.

1.2. Seleção em uma lista

A última função estática permite a entrada por escolha de uma string em uma lista, uma comboBox. Sua sintaxe é apresentada abaixo:

QInputDialog.getItem (parent, title, label, list, current = 0, editable = True)

Os argumentos parent, title e label são os mesmos do diálogo anterior. Os demais argumentos são:

  • list – pode ser uma lista, ou uma tupla, com os elementos do comboBox;
  • current – o elemento padrão selecionado da lista e;
  • editable – um booleando com True para habilitar as entradas à lista.

As linhas abaixo criam os diálogos da próxima figura.

>>> dl = QInputDialog.getItem(None,'getItem', "Selecione um item", 
... ['diodo', 'capacitor', 'resistor', 'transformador'])
>>> dl = QInputDialog.getItem(None,'getItem', "Selecione um item", 
... ('diodo', 'capacitor', 'resistor', 'transformador'), 2, False)

dialog-08

2. Observações finais

Os diálogos gerados pela classe QInputDialog ainda possuem um último argumento (Qt.WindowFlags f = 0), no entanto, não consegui utilizá-lo para colocar alguns comentários de relevância aqui. Se alguém tiver alguma ideia de como se fazer isto, não deixe de comentar.

Este post tem 13 comentários

  1. Jonnathan

    Me ajudou muito. parabens.

  2. Luiz Augusto

    Estes tutoriais sobre PyQt4 são excelentes. Deve ter ajudado muita gente (inclusive eu).

    Muito obrigado!

  3. Igor Dalmagro

    Cara,

    to na quarta aula isso já ta salvando minha vida! ehehe

    Parabéns e Muito Obrigado!

  4. jose joan

    Como vai amigo, preciso tirar duas dúvidas:
    1 – No Qt tenho um DoubleSpinBox,mas preciso tranformar ele em uma variável para que eu possa fazer calculos com ela, como devo fazer isso, já tentei usar Valuechange(double d) por exemplo, mas não funcionou.

    2 – Depois que conseguir essa variável quero usá-la em uma outra classe.

    Por exemplo: a variável foi obtida no Mainwindow.cpp e quero realizar os calculos em calculo.cpp

  5. rudsonalves

    Não sei se entendi o que você está querendo, mas em princípio você pode cria uma variável geral e instanciá-la com o seu objeto DoubleSpinBox. Assim basta acessar o método value() para resgatar o seu valor.

    valueChanged é um sinal gerado por QDoubleSpinBox. Dê uma olhada no texto 13 desta série: http://localhost/MyWorks/?p=2635

  6. Adriel

    Muito boas.
    Não sei alguém ainda acessa, mas caso sim, alguem pode me dizer pq o diálogo gerado pelo getDouble nao aceita a entrada de mais de um algorismo antes da virgula?

    Ex:
    Mesmo eu colocando essa linha de código

    dl = QInputDialog.getDouble(None, ‘QinputDialog getDouble’, ‘Entre com o custo do produto:’, 5.58, 5.0, 15.0, 2)

    no diálogo não é possível digitar 10,88, somente é possível um casa antes da virgula, nesse caso, só ate 9

    Grato

  7. rudsonalves

    Não entendi Adriel. Aqui funcionou muito bem:

    >>> from PyQt4.QtGui import *
    >>> app = QApplication([])
    >>> dl = QInputDialog.getDouble(None, ‘QinputDialog getDouble’, ‘Entre com o custo do produto:’, 5.58, 5.0, 15.0, 2)
    >>> dl
    (10.880000000000001, True)

  8. Jotagê Sales

    Cara muito bom os tutoriais, deu uma luz pra mim.

    te agradeço demais

  9. nicolas ortega

    como debe iniciar el codigo, estoy tratqando de hacerlo por spyder y no me bota nada

    1. rudsonalves

      O que você quer está no texto anterior: http://localhost/MyWorks/2009/07/17/python-pyqt-03-usando-qmessagebox/ .

      Basta aplicar os comandos diretamente no python:

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

      Em seguida pode executar os códigos acima. Isto é uma série Nicolas e muito do que é usado num texto, sem explicações, é porque foi apresentado em textos anteriores. Ao menos é isto o esperado.

Deixe um comentário

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