Чтобы показать, как это делается, в данном разделе мы разработаем шестнадцатеричный наборный счетчик. Наборный счетчик
01 #ifndef HEXSPINBOX_H
02 #define HEXSPINBOX_H
03 #include
04 class QRegExpValidator;
05 class HexSpinBox : public QSpinBox
06 {
07 Q_OBJECT
08 public:
09 HexSpinBox(QWidget *parent = 0);
10 protected:
11 QValidator::State validate(QString &text, int &pos) const;
12 int valueFromText(const QString &text) const;
13 QString textFromValue(int value) const;
14 private:
15 QRegExpValidator *validator;
16 };
17 #endif
Шестнадцатеричный наборный счетчик
01 #include
02 #include "hexspinbox.h"
03 HexSpinBox::HexSpinBox(QWidget *parent)
04 : QSpinBox(parent)
05 {
06 setRange(0, 255);
07 validator = new QRegExpValidator(QRegExp("[0-9A-Fa-f]{1,8}"), this);
08 }
Мы устанавливаем по умолчанию диапазон от 0 до 255 (от 0x00 до 0xFF), который лучше соответствует шестнадцатеричному наборному счетчику, чем диапазон от 0 до 99, принимаемый по умолчанию в QSpinBox.
Пользователь может модифицировать текущее значение наборного счетчика, щелкая по верхней или нижней стрелке или вводя значения в строке редактирования наборного счетчика. В последнем случае мы хотим, чтобы пользователь мог вводить только правильные шестнадцатеричные числа. Для достижения этого мы используем
09 QValidator::State HexSpinBox::validate(QString &text, int &pos) const
10 {
11 return validator->validate(text, pos);
12 }
Эта функция вызывается в
13 QString HexSpinBox::textFromValue(int value) const
14 {
15 return QString::number(value, 16).toUpper();
16 }
Функция
17 int HexSpinBox::valueFromText(const QString &text) const
18 {
19 bool ok;
20 return text.toInt(&ok, 16);
21 }