Мне было любопытно о базовой реализации. Я проверил исходный код в github .
QVariant QDoubleSpinBoxPrivate::validateAndInterpret(QString &input, int &pos,
QValidator::State &state) const
{
if (cachedText == input && !input.isEmpty()) {
state = cachedState;
QSBDEBUG() << "cachedText was '" << cachedText << "' state was "
<< state << " and value was " << cachedValue;
return cachedValue;
}
const double max = maximum.toDouble();
const double min = minimum.toDouble();
QString copy = stripped(input, &pos);
QSBDEBUG() << "input" << input << "copy" << copy;
int len = copy.size();
...
}
Параметры используются в закрытой функции, которая называется stripped
. Это исходный код:
QString QAbstractSpinBoxPrivate::stripped(const QString &t, int *pos) const
{
QString text = t;
if (specialValueText.size() == 0 || text != specialValueText) {
int from = 0;
int size = text.size();
bool changed = false;
if (prefix.size() && text.startsWith(prefix)) {
from += prefix.size();
size -= from;
changed = true;
}
if (suffix.size() && text.endsWith(suffix)) {
size -= suffix.size();
changed = true;
}
if (changed)
text = text.mid(from, size);
}
const int s = text.size();
text = text.trimmed();
if (pos)
(*pos) -= (s - text.size());
return text;
}
Итак, если я правильно понял, учитывая конфигурацию строки и префикса / суффикса, функция берет строку и вычисляет реальный размер проверяемых данных, игнорируя префикс и суффикс.
Функция возвращает уже проверенные данные, которые могут быть проанализированы для вычисления числового значения.
Исходное значение pos, функция вычитает разницу размера проверяемого текста и размера текста после выполнения операции обрезки.