Publicado em Exemplos Qt, Programação

Validação de strings utilizando expressões regulares – C++/Qt

Uma expressão regular descreve um conjunto de cadeias de caracteres, de forma concisa, sem precisar listar todos os elementos do conjunto.

Em Qt existe a classe QRegExp que permite lidar com este tipo de expressões.

Uma das aplicações possíveis poderá ser a validação de dados numa caixa de input, tal como demonstrado no programa que forneço como exemplo.

Convém fazer um leitura prévia sobre este assunto, pelo que deixo estes dois links: link1, link2.

contente

O funcionamento é muito simples:

  • Na caixa “Pattern” definimos a nossa expressão regular. A cor verde ou vermelho  indica se esta é respectivamente válida ou não válida.
  • A caixa “Input Data” apenas aceita dados que satisfaçam a expressão, até que esta seja válida.

Por exemplo, se tivermos um expressão válida cujos dados introduzidos ainda não a satisfizerem, obtemos algo do tipo:
triste

No exemplo dado, apenas são aceites matrículas de automóveis no formato letras-números-números.

Deixo esta ferramenta prática para testar a escrita de expressões regulares cujo código apresento a seguir.

QRegExpTest.h

#ifndef QRegExpTest_H
#define QRegExpTest_H

#include <QDialog>

class QLabel;
class QLineEdit;
class QPushButton;
class QHBoxLayout;
class QVBoxLayout;
class QRegExp;
class QSpacerItem;

class QRegExpTest : public QDialog
{
Q_OBJECT

public:
QRegExpTest(QWidget *parent = 0);

private slots:
void refresh();
void clean();

private:
QLabel *labelPattern;
QLabel *labelInputData;
QLabel *labelStatus;
QLabel *labelStatus2;
QLineEdit *lineEditPattern;
QLineEdit *lineEditInputData;
QSpacerItem *horizontalSpacer;
QPushButton *closeButton;
QVBoxLayout *verticalLayout;
QVBoxLayout *verticalLayout_1;
QVBoxLayout *verticalLayout_2;
QVBoxLayout *verticalLayout_3;
QHBoxLayout *horizontalLayout_1;
QHBoxLayout *horizontalLayout_2;
};

#endif // QRegExpTest_H

QRegExpTest.cpp

#include <QtGui>

#include "QRegExpTest.h"

QRegExpTest::QRegExpTest(QWidget *parent):QDialog(parent){
//Pattern set
labelPattern = new QLabel("&Pattern:");
lineEditPattern = new QLineEdit;
labelPattern->setBuddy(lineEditPattern);

//Input Data set
labelInputData = new QLabel("Input &Data:");
lineEditInputData = new QLineEdit;
labelInputData->setBuddy(lineEditInputData);

//Status set
labelStatus = new QLabel("Status:");
labelStatus2 = new QLabel();
labelStatus2->setPixmap(QPixmap("pixmaps/happy.png"));
labelStatus->setBuddy(labelStatus2);

//CLOSE Button
closeButton = new QPushButton("&Close");
//closeButton->setEnabled(false);

//spacer
horizontalSpacer = new QSpacerItem(400,20, QSizePolicy::Expanding, QSizePolicy::Minimum);

//Definir acções
connect(lineEditPattern, SIGNAL(textChanged(const QString &)),
this, SLOT(refresh()));
connect(lineEditInputData, SIGNAL(textChanged(const QString &)),
this, SLOT(refresh()));
connect(lineEditInputData, SIGNAL(lostFocus()),
this, SLOT(clean()));
connect(closeButton, SIGNAL(clicked()),
this, SLOT(close()));

//layout Dialog
verticalLayout = new QVBoxLayout;
verticalLayout_1 = new QVBoxLayout;
verticalLayout_2 = new QVBoxLayout;
verticalLayout_3 = new QVBoxLayout;
horizontalLayout_1 = new QHBoxLayout;
horizontalLayout_2 = new QHBoxLayout;
verticalLayout_1->addWidget(labelPattern);
verticalLayout_1->addWidget(labelInputData);
verticalLayout_2->addWidget(lineEditPattern);
verticalLayout_2->addWidget(lineEditInputData);
verticalLayout_3->addWidget(labelStatus2);
horizontalLayout_1->addLayout(verticalLayout_1);
horizontalLayout_1->addLayout(verticalLayout_2);
horizontalLayout_1->addLayout(verticalLayout_3);
horizontalLayout_2->addItem(horizontalSpacer);
horizontalLayout_2->addWidget(closeButton);
verticalLayout->addLayout(horizontalLayout_1);
verticalLayout->addLayout(horizontalLayout_2);

setWindowTitle("QRegExp validation test");
setLayout(verticalLayout);
refresh();
}

void QRegExpTest::clean(){
lineEditInputData->setText("");
}

void QRegExpTest::refresh(){
setUpdatesEnabled(false);

QRegExp regExp(lineEditPattern->text());
lineEditPattern->setText(regExp.pattern());
lineEditInputData->setValidator(new QRegExpValidator(regExp, this));

QPalette palette = lineEditPattern->palette();
if(regExp.isValid())
palette.setColor(QPalette::Text, Qt::green);
else
palette.setColor(QPalette::Text, Qt::red);
lineEditPattern->setPalette(palette);

if(lineEditInputData->hasAcceptableInput())
labelStatus2->setPixmap(QPixmap("pixmaps/happy.png"));
else
labelStatus2->setPixmap(QPixmap("pixmaps/sad.png"));

setUpdatesEnabled(true);
}

Nota: A pasta “pixmaps” contém as imagens.

Download: Box.net

Anúncios

9 opiniões sobre “Validação de strings utilizando expressões regulares – C++/Qt

  1. Boa noite. Estou usando o QtCreator só que quando eu vou na pasta do meu executavel ele simplismente não roda. Ele da erro de dependecias, só que eu coloquei as dlls necessárias e mesmo assim não consegui rodar meu programa pela pasta do release. Voce sabe ql pode ser o problema?

    vlws…

  2. Viva!
    Não tenho programado em ambiente Windows ultimamente mas já me colocaram essa questão.
    Ainda não tive tempo de explorar esse assunto mas vou pedir a um rapaz simpático que conheço para colocar aqui um comentário.
    Já agora … existe uma versão ALL IN ONE que instala o Qt+MinGw+QtCreator que configura tudo de forma integrada e quanto a testei pareceu compilar tudos os programas que tinha escrito em ambiente Linux.
    Vamos então ver o que se passa aqui … até já.

  3. Boas, o que se passa no seu caso é que ao correr o programa com o qtcreator, o mingw vai buscar os DLL à pasta bin e executa com sucesso. Quando é necessário ter o executável funcional sem o qtcreator, temos que ter os dll necessários, ou na pasta system32, ou na pasta de onde o executável é executado.

    Todos os dll necessários para a execução de programas em QT podem ser encontrados algures na hierarquia de ficheiros da instalacao do QTCreator.

    Normalmente serão encontrados nas pastas bin, no directorio mingw e qt, se nao estou em erro.
    Quanto aos dll necessários, são os seguintes: (no caso de um programa simples)

    -mingw10m.dll – É o runtime do compilador mingw32;

    -QtCore4.dll – É o dll responsavel pela QCoreApplication, necessaria ao programa;

    -QtGui4.dll – Este dll já comporta a maioria dos objectos da GUI do QT.

    *Nota: Os nomes dos dll podem não estar iguais, mas os nomes correctos são semelhantes.

  4. Ah, eu gostaria de saber tambem se tem alguma opcao que diz ao qmake compilar meu programa usando bibliotecas estaticas e não dinamicas
    Eu quero compilar as bibliotecas estaticas aqui em casa e ter a opcao de escolher.

    Vlwss..

  5. Graciano, parabéns pelo seu blog, sou programador C++ e Qt aqui no Brasil, estava procurando apostilas e tutorias sobre expressões regulares na Internet, minha intenção é gerar relatórios de arquivos de log do iptables, squid e outros, apesar de programar em Qt a alguns anos eu não sabia da classe QregExp, seu artigo serviu como uma luva para o que eu precisava.
    Eu também tenho uma pagina na Internet sobre programação em Qt:

    http://www.sistemasparalinux.com.br/

    Se puder dar uma olhada, seu comentário sera muito importante para mim.

    Ao amigo que assina como kolk3, em minha pagina tenho um pequeno tutorial sobre compilar a Qt no Windows:

    http://www.sistemasparalinux.com.br/qt_Windows.html

    Agradeço a atenção.

    Rodolfo Ribeiro Machado.

    1. Viva Rodolfo!
      Começo por lhe dar os parabéns pela página.
      Está repleta de informação interessante e assenta que nem uma luva no trabalho que eu pretendo desenvolver, uma vez que se centra em:
      – Linux
      – Bases de dados SQL
      – C++/QT
      – entre outros.

      Irei certamente consultar esta página com muita frequência.
      Continuação de bom trabalho.

      1. Graciano, obrigado pelas palavras, não sei se notou, mas minha pagina ficou vários dias fora do ar, advinha qual o sistema operacional do servidor onde ela esta hospedada???

        Felizmente meu provedor de acesso tem a opção de servidores com Linux, já providenciei a transferência, que deve ocorrer agora em novembro, mas a pagina já esta no ar novamente.
        Até mais.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s