jueves, 4 de diciembre de 2014

Primeros pasos en Qt: Creación de widgets customs

Los widgets customs o componentes visuales pueden ser creados a partir de un componente existente o simplemente extendiendo de QWidget.

En este post vamos a extender uno existente. Supongamos que debemos crear un QSpinBox que permita trabajar con hexadecimales:

#ifndef HEXSPINBOX_H
#define HEXSPINBOX_H
#include <QSpinBox>
class QRegExpValidator;
class HexSpinBox : public QSpinBox
{
Q_OBJECT
public:
HexSpinBox(QWidget *parent = 0);
protected:
QValidator::State validate(QString &text, int &pos) const;
int valueFromText(const QString &text) const;
QString textFromValue(int value) const;
private:
QRegExpValidator *validator;
};
#endif

HexSpinBox hereda la mayoría de los métodos, pero sobreescribe, los que necesita. A la vez sobreescribe el constructor:

#include <QtGui>
#include "hexspinbox.h"
HexSpinBox::HexSpinBox(QWidget *parent)
: QSpinBox(parent)
{
setRange(0, 255);
validator = new QRegExpValidator(QRegExp("[0-9A-Fa-f]{1,8}"), this);
}

Setamos el rango desde 0 a 255 es decir 0 a FF. También debemos modificar los botones de tal manera que cuando sea presionados permitan ir navegando entre los números en hexadecimales, es decir luego del 10 siga con A.

Para validar este componente usa el metodo validate que es llamado por  QSpinBox.

QValidator::State HexSpinBox::validate(QString &text, int &pos) const
{
return validator->validate(text, pos);
}

Validate solo utiliza la expresión regular para validar. Ahora debemos escribir los métodos que pasen nuestros números a String y viceversa.

QString HexSpinBox::textFromValue(int value) const
{
return QString::number(value, 16).toUpper();
}

QString HexSpinBox::textFromValue(int value) const
{
return QString::number(value, 16).toUpper();
}

Y eso es todo tenemos nuestro primer componente!