LINUX.ORG.RU

QlineEdit валидатор для ввода чисел с плавающей точкой или без

 


0

1

Есть в самом qt QdoubleValidator для эдитора, но он работает некорректно если в поле написано число которое больше или равно регистру ввода. Пример я хочу проверку на ввод числа в приделах 0, 20, 3 знака после запятой. Допустим 12,305. Если в поле qlineEdit будет пусто и я начну вводить с клавиатуры число то по достижению цифры «5» числа 12,305 я больше не смогу больше ввезти. Но если в поле будет число 12,305 и начать ввод то валидатор даст такую возможность можно сделать 12,305689 или 12,305рпрмр.

QlineEdit пуст —> все работает. QlineEdit не пуст загружено число 12,3 —> все работает. QlineEdit не пуст загружено число 12,30 —> все работает. QlineEdit не пуст загружено число 12,305 —> не работает. Работает если только очистить поле ввода сначала.

Ответ на: комментарий от fluorite

Пробовал но не помогло.

class MyValidator : public QDoubleValidator
{
    public:
    MyValidator(double bottom, double top, int decimals, QObject * parent) :
    QDoubleValidator(bottom, top, decimals, parent)
    {
    }

    QValidator::State validate(QString &s, int &i) const
    {
        if (s.isEmpty() || s == "-") {
            return QValidator::Intermediate;
        }

        QLocale locale;

        QChar decimalPoint = locale.decimalPoint();
        int charsAfterPoint = s.length() - s.indexOf(decimalPoint) -1;

        if (charsAfterPoint > decimals() && s.indexOf(decimalPoint) != -1) {
            return QValidator::Invalid;
        }

        bool ok;
        double d = locale.toDouble(s, &ok);

        if (ok && d >= bottom() && d <= top()) {
            return QValidator::Acceptable;
        } else {
            return QValidator::Invalid;
        }
    }
};

ui->lineEdit->setValidator( new MyValidator(0.0, 20.0, 3, this));
Alex_Golubev
() автор топика

Никогда на Qt не писал. Взялся поиграть в вашу игру.

Часов пять убил на попытки воспроизвести. Не воспроизводится, хоть тресни.

или 12,305рпрмр

это напрочь противоречит

double d = locale.toDouble(s, &ok);

Разве у вас:

#include <iostream>
#include <QLocale>

int main(int argc, char *argv[]) {
    QLocale *locale = new QLocale();
    std::cout <<
        "\nname\t:" << qPrintable(locale->name()) <<
        "\ndecimal\t:" << qPrintable(locale->decimalPoint());

    QString s ="12,305рпрмр";
    bool ok;
    double d = locale->toDouble(s, &ok);
    std::cout <<
        "\nvalue\t:" << d <<
        "\nok\t:" << ok <<
        "\n\n";
    return 0;
}
такое работает?

Если не работает (value :0 ok :0) как и должно быть, значит у вас где-то раньше что-то не так и до самого валидатора дело даже не доходит.

Toxo2 ★★★★
()