Есть QLineEdit, в которое нужно вводить только вещественные значения(например, maxAccelerationValue).
Я так понимаю, тут есть два варианта.
Хорошо, я определяю регулярное выражение:
#define DOUBLE_RX "^[0-9]+\\.?[0-9]*$"
Затем в конструкторе самого окна выставляю для QLineEdit валидатор:
ui->maxAcceleration_line->setValidator(valiDouble);
Однако всё равно можно вводить и иные символы кроме цифр и точки.
У 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,"Ввод корректен", "Это вещественное число");
}
}
Чтобы я не вводил, даже вещественные значения, всё равно критикал.
Для ввода вещественных чисел есть готовый 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 ();
}
Однако всё равно можно вводить и иные символы кроме цифр и точки.
С регэкспом тоже можно, но где-то допущена ошибка. За отсутствием полного кода, где именно — сказать не смогу.
Проверка на ввод числа
Способ сам по себе плох, а в реализации написана какая-то околесица.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Пытаюсь написать простенькую фонотеку, где класс содержит название и исполнителя трекаПользователь должен ввести эти данные сам
недавно написал консольные крестики-нолики и сделал управление в игре через передачу данный с помощью cinХотелось бы как-то упустить этап...
В чем их преимущество? Где их используют? Чем они отличаются от 'просто' интерфейса с одним методом? Есть примеры использования функциональных...