Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Crazy Sage от Октябрь 05, 2009, 09:35



Название: Вопрос по QDoubleValidator [QT 3.3]
Отправлено: Crazy Sage от Октябрь 05, 2009, 09:35
Делаю проверку трех полей (градусы, минуты, секунды), на первых двух соответственно QIntValidator, на третьем QDoubleValidator
Код соответственно

Код:
degreeField=new QLineEdit(this);
degreeLabel=new QLabel(this);
minuteField=new QLineEdit(this);
minuteLabel=new QLabel(this);
secondField=new QLineEdit(this);
secondLabel=new QLabel(this);
degreeValidator=new QIntValidator(0, 360, degreeField);
degreeField->setValidator(degreeValidator);
minuteValidator=new QIntValidator(0, 60, minuteField);
minuteField->setValidator(minuteValidator);
secondValidator=new QDoubleValidator(0.0, 60.0, 5, secondField);
secondField->setValidator(secondValidator);

В интовых полях все замечательно и вводить можно только числа из указанного промежутка, в дабловом поле запрещается вводить буквы и знаки препинания, кроме точки и запятой, но значение числа и количество символов после точки\запятой вводится какое угодно. Что я делаю не так?

П.С. чуть не забыл, QT версии 3.3


Название: Re: Вопрос по QDoubleValidator [QT 3.3]
Отправлено: Hellraiser от Октябрь 05, 2009, 15:50
Из ассистента:
Цитировать
QValidator::State QDoubleValidator::validate ( QString & input, int & ) const [virtual]
Returns Acceptable if the string input contains a double that is within the valid range and is in the correct format.
Returns Intermediate if input contains a double that is outside the range or is in the wrong format, e.g. with too many digits after the decimal point or is empty.
Returns Invalid if the input is not a double.
Note: If the valid range consists of just positive doubles (e.g. 0.0 - 100.0) and input is a negative double then Invalid is returned.
Т.е., при потере фокуса (как вариант) надо проверять на состояние QValidator::Intermediate. Далее, все что пожелает фантазия - вернуть обратно, вывести мессагу, подкрасить поле красным,...


Название: Re: Вопрос по QDoubleValidator [QT 3.3]
Отправлено: Crazy Sage от Октябрь 05, 2009, 18:31
Не совсем то, что хочется. Хочется дабловым валидатором не давать вводить не те значения в принципе. С интовым ведь работает


Название: Re: Вопрос по QDoubleValidator [QT 3.3]
Отправлено: Hellraiser от Октябрь 05, 2009, 19:13
Так напиши обработчик сигнала QLineEdit::textChanged и в нем проверяй статус валидатора


Название: Re: Вопрос по QDoubleValidator [QT 3.3]
Отправлено: Crazy Sage от Октябрь 05, 2009, 19:33
Нет, ну понятное дело, что можно и обработчики написать и вобще свой виджет. Но если для инта это делается одной строчкой setValidator, то логично предположить что для дабла тоже должна быть такая возможность. Вот я и пытаюсь понять, в чем проблема.


Название: Re: Вопрос по QDoubleValidator [QT 3.3]
Отправлено: Hellraiser от Октябрь 05, 2009, 20:16
Проблему смотрим в исходниках (qvalidator.cpp):
Реализация QIntValidator::validate
Код:
...
    long entered = input.toLong( &ok );
    if ( !ok || (entered < 0 && b >= 0) ) {
return Invalid;
    } else if ( entered >= b && entered <= t ) {
return Acceptable;
    } else {
if ( entered >= 0 )
    return ( entered > t ) ? Invalid : Intermediate;
else
    return ( entered < b ) ? Invalid : Intermediate;
    }
Т.е. идет прямое сравнение числа с min/max (b/t соответственно) и возврат состояния Invalid. В реализации QDoubleValidator::validate такой явной проверки нет. Проверяется только на отрицательное число при положительных границах
Код:
...
    if ( entered < b || entered > t )
return Intermediate;
    else
return Acceptable;
да и то возвращается Intermediate. Данное состояние позволяет выполнять ввод цифр далее.
Либо наследуемся от QDoubleValidator и переопределяем validate, либо ловим сигналы QLineEdit и фильтруем ввод.


Название: Re: Вопрос по QDoubleValidator [QT 3.3]
Отправлено: Igors от Октябрь 05, 2009, 21:34
Либо наследуемся от QDoubleValidator и переопределяем validate, либо ловим сигналы QLineEdit и фильтруем ввод.
Да, "само" оно целую часть не ограничивает (Qt 4.5.2). Выглядит немного странно, но с др. стороны - меньше проблем с точкой. Примеры:

- ввел сначала  12345, потом исправил на 0.12345
- ввел 12.3465, потом исправил на 1.23456. А как бы исправил при "правильном" валидаторе?

Так что смысл это "intermediate" имеет, возможно "так задумано" :)