crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Минимум в QIntValidator
borune
  опции профиля:
сообщение 20.1.2015, 17:36
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 152
Регистрация: 1.1.2011
Пользователь №: 2314

Спасибо сказали: 0 раз(а)




Репутация:   0  


Судари, приветствую всех.

Сабж таков, не могу настроить минимальное значение QIntValidator'а. Делаю так:
Раскрывающийся текст
lineEdit->setValidator(new QIntValidator(5,20,this));

В таком варианте валидатор разрешает вводить числа в диапазоне [0-20]. Не устраивает. Нужен диапазон [5;20]

Почитал тут. Попробовал перегрузить метод validate:
Раскрывающийся текст
class intValidator : public QIntValidator
{
public:
    intValidator(int min,int max,QObject *obj):QIntValidator(min,max,obj){}
    ~intValidator(){}

    QValidator::State validate(QString &input, int &pos) const
    {
        QIntValidator::State result(QIntValidator::validate(input, pos));
        if (result == QValidator::Intermediate) result = QValidator::Invalid;
        return result;
    }
};

...
lineEdit->setValidator(new intValidator(5,20,this));

Этот вариант запрещает вводить цифры 1,2,3,4. Остальные цифры вводить можно, но нельзя их потом удалить. Еще хуже, чем в первом варианте.

Подскажите, как все-таки заставить валидатор видеть минимум?

Сообщение отредактировал borune - 20.1.2015, 17:37
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 20.1.2015, 18:39
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Можно добавить в начале метода validate строку:
if (input.isEmpty()) { return QValidator::Intermediate; }

Тогда будет разрешено удаление чисел, но lineEdit будет пропускать пустые строки как валидные.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 20.1.2015, 19:53
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Разве это возможно? Как вы введете число например 14 не вводя 1 или 4?
Перед сабмитом просто проверяйте что валидатор возвращает Valid.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
borune
  опции профиля:
сообщение 20.1.2015, 22:20
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 152
Регистрация: 1.1.2011
Пользователь №: 2314

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(ilyabvt @ 20.1.2015, 19:39) *
Тогда будет разрешено удаление чисел, но lineEdit будет пропускать пустые строки как валидные.
ну не вариант, нельзя пустое оставлять)

Цитата(lanz @ 20.1.2015, 19:53) *
Перед сабмитом просто проверяйте что валидатор возвращает Valid.
Ну это неинтересно=) в этом случае придется выдавать сообщение пользователю о том, что он что-то где-то неверно ввел, и просить откорректировать введенные данные, а если пользователь попадется не очень умный, то это сообщение может поставить его в тупик. Поэтому хотелось бы реализовать все так, чтоб у пользователя просто не было возможности ввести неверное значение.

Цитата(lanz @ 20.1.2015, 20:53) *
Разве это возможно? Как вы введете число например 14 не вводя 1 или 4?
Ну, как вариант, не давать лайнэдиту терять фокус пока не введены корректные данные. Просто в документации явно сказано
Раскрывающийся текст
QIntValidator::QIntValidator ( int minimum, int maximum, QObject * parent = 0 )
Constructs a validator with a parent, that accepts integers from minimum to maximum inclusive.
а на деле получается, что он принимает целые от 0 до максимума. Не понятно.

Сообщение отредактировал borune - 20.1.2015, 22:30
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 21.1.2015, 0:09
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
Ну, как вариант, не давать лайнэдиту терять фокус пока не введены корректные данные

Запросто :lol:
http://qt-project.org/doc/qt-4.8/qwidget.html#focusOutEvent
Можно проверять валидатор и ресетить фокус.

А если юзер хочет пока не вводить это поле а ввести другое? Если он хочет переключить фокус, а сюда случайно кликнул и вы его там залочили пока он не введет правильно? "Ну тупой виндовс, идиоты в майкросовте опять все по дебильному сделали :mad: !!!111ОДИНОДИН" :lol:

Цитата
а на деле получается, что он принимает целые от 0 до максимума. Не понятно.

Что, он возвращает Acceptable для целых меньше minimum?

Пример из документации:
Цитата
This virtual function returns Invalid if input is invalid according to this validator's rules, Intermediate if it is likely that a little more editing will make the input acceptable (e.g. the user types "4" into a widget which accepts integers between 10 and 99), and Acceptable if the input is valid.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 10:21