Russian Qt Forum
Ноябрь 26, 2024, 09:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по QDoubleValidator [QT 3.3]  (Прочитано 8525 раз)
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
« Последнее редактирование: Октябрь 05, 2009, 09:37 от Crazy Sage » Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #1 : Октябрь 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. Далее, все что пожелает фантазия - вернуть обратно, вывести мессагу, подкрасить поле красным,...
Записан
Crazy Sage
Гость
« Ответ #2 : Октябрь 05, 2009, 18:31 »

Не совсем то, что хочется. Хочется дабловым валидатором не давать вводить не те значения в принципе. С интовым ведь работает
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #3 : Октябрь 05, 2009, 19:13 »

Так напиши обработчик сигнала QLineEdit::textChanged и в нем проверяй статус валидатора
Записан
Crazy Sage
Гость
« Ответ #4 : Октябрь 05, 2009, 19:33 »

Нет, ну понятное дело, что можно и обработчики написать и вобще свой виджет. Но если для инта это делается одной строчкой setValidator, то логично предположить что для дабла тоже должна быть такая возможность. Вот я и пытаюсь понять, в чем проблема.
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #5 : Октябрь 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 и фильтруем ввод.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Октябрь 05, 2009, 21:34 »

Либо наследуемся от QDoubleValidator и переопределяем validate, либо ловим сигналы QLineEdit и фильтруем ввод.
Да, "само" оно целую часть не ограничивает (Qt 4.5.2). Выглядит немного странно, но с др. стороны - меньше проблем с точкой. Примеры:

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

Так что смысл это "intermediate" имеет, возможно "так задумано" Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.084 секунд. Запросов: 22.