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
  опции профиля:
сообщение 23.12.2011, 22:06
Сообщение #2


Студент
*

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

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




Репутация:   3  


Не совсем понятно что вам нужно. Пользователю позволяется вводить данные, которые поддерживает QRegExpValidator. Если вам нужен диапазон [0..FFFFFF] просто замените:

1) setRange(0x0, 0xFFFFFF);
2) QRegExp ("[0-9A-Fa-f]{1,6}")

Стрелочки анализируют состояние членов-данных (minimum, maximum) установленных через setRange. Обычный ввод не контролируется этими членами-данными, после того как вы переопределили функцию validate. Вся ответственность на проверку при вводе ложится на вашу функцию.

Если есть необходимость использовать параметры (minimum,maximum), то используйте следующий код:

    
QValidator::State <your hexspinbox class>::validate(QString &text, int &pos) const
{
if (text.toInt(0,16)<=this->maximum())
return (validator->validate(text,pos));
return QValidator::Invalid;
}

Если существует тесная связь с функцией validate родителя и хотите использовать именно ее для проверки, то можете использовать следующий код

 
QValidator::State <your hexspinbox class>::validate(QString &text, int &pos) const
{
int fpos = 0;
QString txt = QString::number(text.toInt(0,16));

if ((QSpinBox::validate(txt,fpos)!=QValidator::Invalid))
return (validator->validate(text,pos));
return QValidator::Invalid;
}


Именно для вашего случая считаю наилучшим выбор с изменениями setRange и QRegExp описанный в самом начале.

Сообщение отредактировал BlueIceScream - 23.12.2011, 22:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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




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