Пользователь может модифицировать текущее значение наборного счетчика, щелкая по верхней или нижней стрелке или вводя значения в строке редактирова­ния наборного счетчика. В последнем случае мы хотим, чтобы пользователь мог вво­дить только правильные шестнадцатеричные числа. Для достижения этого мы исполь­зуем QRegExpValidator, который принимает один или несколько символов со значения­ми каждого символа в диапазонах от «0» до «9», от «А» до «F» или от «а» до «f».

QValidator::State HexSpinBox::validate(QString &text, int &pos) const {

return validator->validate(text, pos);

}

Эта функция вызывается в QSpinBox для проверки допустимости введенного текста. Результат может иметь одно из трех значений: Invalid (текст не соответству­ет регулярному выражению), Intermediate (текст, вероятно, является частью допус­тимого значения) и Acceptable (текст допустим). QRegExpValidator имеет подходя­щую функцию validateO, поэтому мы просто возвращаем результат ее вызова. Те­оретически следует возвращать Invalid или Intermediate для значений, лежащих вне диапазона наборного счетчика, но QSpinBox достаточно «умен» и может самостоя­тельно отследить эту ситуацию.

QString HexSpinBox::textFromValue(int value) const {

return QString::number(value, 16).toUpper();

}

Функция textFromValueO преобразует целое число в строку. QSpinBox вызывает ее для обновления строки редактирования в наборном счетчике, когда пользователь нажимает клавиши верхней или нижней стрелки наборного счетчика. Мы использу­ем статическую функцию QString:: number(), задавая 16 в качестве второго аргумента для преобразования значения в представленное в нижнем регистре шестнадцатерич-ное число, и вызываем функцию QString: :toUpper() для преобразования результата в верхний регистр.

int HexSpinBox::valueFromText(const QString &text) const {

bool ok;

return text.toInt(&ok, 16);

}

Функция valueFromText() выполняет обратное преобразование из строки в це­лое число. Она вызывается в QSpinBox, когда пользователь вводит значение в строку редактирования наборного счетчика и нажимает клавишу Enter. Мы используем функцию QSt ring:: tolnt () для попытки преобразования текущего текстового значе­ния (возвращаемого QSpinBox: :text()) в целое число, вновь используя 16 в качестве базы


<< назад вперед >>