Контроль ввода в QLineEdit

189
30 октября 2018, 08:40

Есть QLineEdit, в которое нужно вводить только вещественные значения(например, maxAccelerationValue).

Я так понимаю, тут есть два варианта.

  1. QValidator.

Хорошо, я определяю регулярное выражение:

#define DOUBLE_RX "^[0-9]+\\.?[0-9]*$"

Затем в конструкторе самого окна выставляю для QLineEdit валидатор:

    ui->maxAcceleration_line->setValidator(valiDouble);

Однако всё равно можно вводить и иные символы кроме цифр и точки.

  1. Проверка на ввод числа

У QLineEdit делаю слот:

void ParametersWindow::on_maxAcceleration_line_editingFinished()
{
    double temp = ui->maxAcceleration_line->text().toDouble();
    if (!isdigit(temp))
        QMessageBox::critical(this, "Неправильный формат ввода", "Введите вещественное число");
}

В этом случае выходит сообщение даже при вводе вещественного числа. При нажатии Ок у диалога окно параметров закрывается. А если не закрывается, то курсор перескакивает на другую QLineEdit.

Подскажите, как корректно реализовать?

UPD: Создал валидатор для вещественных значений и установил его для QLineEdit:

QDoubleValidator *valiDouble = new QDoubleValidator(this);
ui->maxAcceleration_line->setValidator(valiDouble);

Затем по окончанию ввода в текстовое поле проверяю валидность:

void ParametersWindow::on_tauSafe_line_editingFinished()
{
    if(ui->tauSafe_line->hasAcceptableInput()) {
        QMessageBox::critical(this,"Ошибка ввода", "Введите вещественное число");
    } else {
        QMessageBox::information(this,"Ввод корректен", "Это вещественное число");
    }
}

Чтобы я не вводил, даже вещественные значения, всё равно критикал.

Answer 1

Для ввода вещественных чисел есть готовый QDoubleValidator. В сомом простом случае использование элементарное:

ui->maxAcceleration_line->setValidator (new QDoubleValidator (this));

Самодостаточный минимальный пример:

// Build with: g++ -I/usr/include/qt4/{QtCore,QtGui,} -lQt{Gui,Core} -o validator main.cpp
#include <QApplication>
#include <QLineEdit>
#include <QDoubleValidator>
int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    QLineEdit *le = new QLineEdit;
    le->setValidator (new QDoubleValidator(le));
    le->show ();
    return a.exec ();
}

Однако всё равно можно вводить и иные символы кроме цифр и точки.

С регэкспом тоже можно, но где-то допущена ошибка. За отсутствием полного кода, где именно — сказать не смогу.

Проверка на ввод числа

Способ сам по себе плох, а в реализации написана какая-то околесица.

READ ALSO
error: expected initializer before &#39;.&#39; token

error: expected initializer before '.' token

Пытаюсь написать простенькую фонотеку, где класс содержит название и исполнителя трекаПользователь должен ввести эти данные сам

171
Аналог getch() на чистом c++ или с использованием WIN API

Аналог getch() на чистом c++ или с использованием WIN API

недавно написал консольные крестики-нолики и сделал управление в игре через передачу данный с помощью cinХотелось бы как-то упустить этап...

402
Зачем нужны функциональные интерфейсы?

Зачем нужны функциональные интерфейсы?

В чем их преимущество? Где их используют? Чем они отличаются от 'просто' интерфейса с одним методом? Есть примеры использования функциональных...

205