QRegExpValidator максимальное значение

Я хотел бы использовать QRegExpValidator, чтобы заставить пользователя: - вводить значения только из определенного диапазона (тип double), - тип double должен вводиться с использованием точки, а не комы - другие форматы не допускаются

Пока у меня есть:

QRegExpValidator* rxv = new QRegExpValidator(QRegExp("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?"), this);

Этот валидатор заставляет пользователя вводить только двойные значения с точкой. Однако я не знаю, как запретить пользователю вводить значения вне диапазона (например, диапазон будет от 0 до 100,0). Я бы хотел помочь.


person Łukasz Przeniosło    schedule 12.05.2015    source источник


Ответы (1)


Вы можете написать свой собственный валидатор на основе QValidator. Все, что вам нужно, это реализовать virtual State validate(QString &input, int &pos) const = 0.

ОБНОВЛЕНИЕ

Пример:

MyValidator.h:

class MyValidator : public QValidator
{
    Q_OBJECT
public:
    MyValidator(double min, double max, QObject *parent = 0);

    State validate(QString &input, int &pos) const;

private:
    QRegExp mRexp;
    double mMin;
    double mMax;
};

MyValidator.cpp:

MyValidator::MyValidator(double min, double max, QObject *parent) :
    QValidator(parent)
  , mRexp("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?")
  , mMin(min)
  , mMax(max)
{}

QValidator::State MyValidator::validate(QString &input, int &pos) const
{
    if (input.isEmpty())
        return Acceptable;
    if (!mRexp.exactMatch(input))
        return Invalid;
    const double val = input.toDouble();
    if (mMin <= val && val <= mMax)
        return Acceptable;
    return Intermediate;
}
person Amartel    schedule 12.05.2015
comment
Я не знаю, как это сделать, не могли бы вы показать пример кода? - person Łukasz Przeniosło; 12.05.2015
comment
Спасибо. Ваш ответ почти один. Я пробовал модифицировать его как бота, чтобы он работал как надо, но мне это не удалось. Проблема заключается в методе MyValidator. Например, предположим, что min равно 5, а max равно 9. После того, как я напишу (например, в lineEdit) номер 1, я больше не могу вернуться на место, так как это задано как Invalid. С другой стороны, если я изменю первое выражение, чтобы вернуть Intermediate, я смогу принять номер 1 ... Как это преодолеть? - person Łukasz Przeniosło; 13.05.2015
comment
Обновленные источники. Кроме того, я бы порекомендовал вам изменить ваше регулярное выражение на это: [- +]? [0-9] + \\.? [0-9] * ([eE] [- +]? [0-9] +) ? - проще вводить дробные числа. - person Amartel; 13.05.2015
comment
Думаю, сейчас это работает, но теперь я могу ввести отрицательные значения. РЕДАКТИРОВАТЬ: я думаю, что регулярное выражение вообще не работает в этой функции - person Łukasz Przeniosło; 13.05.2015
comment
Конечно, работает - не позволяет вводить буквы и прочее. Также он содержит символ '-'. Если вам не нужны отрицательные значения - удалите это из регулярного выражения. Или усложните функцию проверки. Мой - всего лишь пример. - person Amartel; 13.05.2015