crossplatform.ru

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

> HexSpinBox из примера в книге Бланшет
Steklova Olga
  опции профиля:
сообщение 23.12.2011, 16:18
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


Здравствуйте!
Мне понадобился в программе виджет для редактирования 16-ного числа с диапазоном [0..FFFFFF].
Использовала для этого QLineEdit.
QRegExp regExp("[0-9A-Fa-f]{0,6}"); 
lineEdit->setValidator(new QRegExpValidator(regExp, this));
Более-менее работает, но хочется менять значение по стрелочкам, как в QSpinBox.
Нашла в книге Ж.Бланшет "Qt4 программирование QUI на C++" в главе 5 пример,
где на основе QSpinBox создается класс HexSpinBox.
Там установлен диапазон значений, он правильно анализируется при изменении значения по стрелочкам, НО юзер может ввести значение, превышающее диапазон. Как это исправить?

Сообщение отредактировал Steklova Olga - 27.12.2011, 10:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
BlueIceScream
  опции профиля:
сообщение 26.12.2011, 19:56
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 56
Регистрация: 21.11.2011
Из: Республика Дагестан
Пользователь №: 3016

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




Репутация:   3  


Цитата
PS Получается, что в книге Бланшет фраза на стр. 106 ошибочна?
("Теоретически следует возвращать Invalid или Intermediate для значений, лежащих вне диапазона наборного счетчика, но QSpinBox достаточно "умен" и может самостоятельно отследить эту ситуацию.")


Мариус Бугге, Пол Олав и Жасмин Бланшет ошиблись? А мы нет? Это что то нереальное.

Конено же нет. Пример Жасмин работает так как надо. Работает отлично. Ее предложение которое вы привели тоже истина. И ее решение намного лучше, чем которое предложила я.

Если вы хорошенько присмотритесь к ее примеру и тому что у вас получилось, сразу станет ясно где хороший код, а где мусор.

Итак.

В своем примере Жасмин исходит из следующих соображений:
1) Стрелки никогда не выведут значение за диапазон.
2) Пусть пользователь вводит все что угодно, однако после того как элемент потеряет фокус QSpinBox все равно установит реальное значение из диапазона.

Например: если вы введете число выходящее за диапазон (а пример Жасмин позволяет это сделать), затем элемент потеряет фокус, и вы увидите что в элементе стоит максимальное значение диапазона. QSpinBox непременно проверит его и поставит верное значение. Но это случится после потери фокуса.

Вам же этого не хотелось. Вам хотелось чтобы пользователь просто не мог вводить и все.

Теперь посмотрите на ваш пример. Вроде бы все чудесно работает. Однако...
Допустим диапазон (10,255). Пользователь хочет ввести значение 0x90. Такое значение допустимо. судя по диапазону. Но что делает элемент при этом? Он не пускает стереть букву A, которое представляет собой минимальное значение диапазона и стирать его функция validate не даст. Почему? Ведь пользователь хочет ввести вполне разрешенное число 0x90. Таким образом получается что первая цифра должна быть больше A. Очень большие сложности при вводе не правда ли? А некоторые разрешенные значения кроме как копировать-вставить или нажатиями на стрелочки и не введешь.

Теперь я думаю понятно почему Жасмин не делает проверку при вводе. Она оставляет это все на рассмотрение QSpinBox по завршению ввода. И я думаю это лучший вариант.

Таким образом ошибается не Жасмин. А мы. И ошибаемся серьезно.




Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 23.11.2024, 11:57