Проверка вводимых пользователем данных. Часть первая. Целые и вещественные числа

DoubleValidator/main.cpp
DoubleValidator/mainwindow.h
DoubleValidator/mainwindow.cpp

Когда пользователю предлагается ввести какие-либо данные в текстовое поле, то довольно часто можно получить что-то абсолютно неожиданное. Пользователь может ввести числа прописью, использовать неверный десятичный разделитель или забыть указать код города в телефонном номере. Таким образом, в большинстве случаев, необходимо проверять правильность(допустимость)1 указанной информации.
Qt содержит класс QValidator, гарантирующий корректность введенных данных. Данных класс не может быть использован напрямую. Для проверки данных придется либо воспользоваться готовыми подклассами QIntValidator, QDoubleValidator, QRegExpValidator, либо написать подкласс самим.
В метод validate(QString & input, int & pos) передается строка для проверки и позиция курсора. Метод может возвращать следующие значения:

  • QValidator::Invalid — строка недопустима.
  • QValidator::Acceptable — строка допустима.
  • QValidator::Intermediate — строка не может быть принята в текущем состоянии, но она может стать допустимой.

Составим программу, которая будет проверять, является ли строка вещественным числом. Воспользуемся готовым классом QDoubleValidator:

MainWindow::MainWindow()
{
    grid = new QGridLayout;
    doubleedit = new QLineEdit;
    lbdouble = new QLabel(tr("Double:"));
    lbresult = new QLabel(tr("Result:"));
    result = new QLabel;
    vld = new QDoubleValidator(-5, 2999, 5, this);
    vld->setNotation(QDoubleValidator::ScientificNotation);
    doubleedit->setValidator(vld);
    grid->addWidget(lbdouble, 0, 0);
    grid->addWidget(doubleedit, 0, 1);
    grid->addWidget(lbresult, 1, 0);
    grid->addWidget(result, 1, 1);
    resize(160, 120);
    setLayout(grid);
...
}

Конструктор класса QDoubleValidator может принимать следущие параметры:
QDoubleValidator::QDoubleValidator ( double bottom, double top, int decimals, QObject * parent )

Диапазон вещественных чисел от bottom до top включительно. decimals — количество знаков после десятичного разделителя2.
Используя метод setNotation(Notation) класса QDoubleValidator можно установить допустимость научной нотации:
  • QDoubleValidator::StandardNotation — стандартная нотация(Например: 1,124 или -2).
  • QDoubleValidator::ScientificNotation — научная нотация, т.е. число может иметь экспоненциальную часть(Например: 2,7E-3 или 3,3E+2)

Для проверки допустимости введенных данных воспользуемся методом validate():

MainWindow::MainWindow()
{
...
    QObject::connect(doubleedit, SIGNAL(textChanged (const QString &)), this, SLOT(showresult(const QString &)));
}
 
void MainWindow::showresult(const QString &text)
{
    int pos = 0;
    QString numtext = text;
    if (vld->validate(numtext, pos) == 0) result->setText(tr("invalid"));
    if (vld->validate(numtext, pos) == 1) result->setText(tr("Intermediate"));
    if (vld->validate(numtext, pos) == 2) result->setText(tr("Acceptable"));
}

Validator.png
page_revision: 19, last_edited: 1202659832|%e %b %Y, %H:%M %Z (%O ago)
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License