Пользователь может модифицировать текущее значение наборного счетчика, щелкая по верхней или нижней стрелке или вводя значения в строке редактирования наборного счетчика. В последнем случае мы хотим, чтобы пользователь мог вводить только правильные шестнадцатеричные числа. Для достижения этого мы используем 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 в качестве базы
<< назад вперед >>