Проверка корректности ввода

163
03 ноября 2018, 15:10

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

Нужно, чтобы после ввода, т.е. по потере фокуса, происходила проверка корректности ввода во втором поле. Если ввод корректный, то ничего не выводить, если в строке помимо вещественных чисел ещё какая-то бурда, то возмутиться, если там только вещественные значения, но их не нужное количество, то легко намекнуть дописать.

Создал свой класс-наследник от валидатора, где произвожу проверку ввода, и установил этот валидатор во второе поле ввода:

QValidator::State CustomValidator::validate(QString &str, int &pos) const {
QStringList nomTimes;
int flowQuantity = pos;
flowQuantity = parameters->getFlowQnt();
QRegExp regExp("^(\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)(?:,\\h(?1))*$");
if (!regExp.exactMatch(str)) {
    //QMessageBox::critical(this->parameters, "Некорректный ввод", "Введите вещественные числа, разделяя их запятой с пробелом!");
    return QValidator::Invalid;
} else {
    nomTimes = regExp.capturedTexts();
    if (nomTimes.size() != flowQuantity) {
        //QMessageBox::critical(this->parameters, "Некорректный ввод", "Количество введённых значений не соответсвтует количеству требуемых элементов");
        return QValidator::Intermediate;
    } else {
        return QValidator::Acceptable;
    }
}

}

Ну а дальше:

void ParametersWindow::on_tauFlow_line_editingFinished()
{
    if (!ui->tauFlow_line->hasAcceptableInput()) {
        QMessageBox::critical(this,"Ошибка ввода", "Введите корректные данные");
        ui->tauFlow_line->clear();
        ui->tauFlow_line->setFocus();
    }
}

Проблемы:

  1. Если этот валидатор установлен в QLineEdit, то он вообще не позволяет что-либо написать или отредактировать.
  2. hasAcceptableInput() возвращает bool, и не понятно, с каким значением завершил работу валидатор.

Если я в чём-то ошибаюсь — поправьте. Если совсем не так это делается — подскажите, как реализовать.

UPD1: Первая проблема решилась отключением валидатора. Соответственно проверка корректности ввода из validate перешла в on_tauFlow_line_editingFinished()

READ ALSO
Рекурсивное вычисление высоты дерева

Рекурсивное вычисление высоты дерева

Написала функцию Hight(int r, int *mas), которая должна вычислять высоту дереваДерево представляется в виде массива чисел, где mas[i] = это родитель i - го ребенка

168
Как с помощью глобального хука отменить действие мыши?

Как с помощью глобального хука отменить действие мыши?

Есть мысль написать ремапер мышиНо для этого необходимо отменять определённые действия мыши

205
Сортировка компонентов в NetBeans

Сортировка компонентов в NetBeans

Подскажите пожалуйста, как установить сортировку компонентов в пакете по типуРаботаю в IDE NetBenas

154