IntValidator пытается проверять ваш ввод каждый раз, когда вы набираете символ, и возвращает 3 возможных состояния: Неверный, Средний, Приемлемый.
Представьте себе сценарий, в котором вы устанавливаете нижнее значение 20, а верхнее значение 1000 Теперь вы хотите набрать 100, но IntValidator выдаст Invalid для 1, 10, потому что эти значения меньше 20, поэтому он не позволит вам ввести ни одно из них, поэтому он возвращает Intermediate.
Вы можете увидеть, что происходит в источнике Qt:
QValidator::State QIntValidator::validate(QString & input, int&) const
{
QByteArray buff;
if (!locale().d->m_data->validateChars(input, QLocaleData::IntegerMode, &buff, -1,
locale().numberOptions())) {
return Invalid;
}
if (buff.isEmpty())
return Intermediate;
const bool startsWithMinus(buff[0] == '-');
if (b >= 0 && startsWithMinus)
return Invalid;
const bool startsWithPlus(buff[0] == '+');
if (t < 0 && startsWithPlus)
return Invalid;
if (buff.size() == 1 && (startsWithPlus || startsWithMinus))
return Intermediate;
bool ok;
qlonglong entered = QLocaleData::bytearrayToLongLong(buff.constData(), 10, &ok);
if (!ok)
return Invalid;
if (entered >= b && entered <= t) {
locale().toInt(input, &ok);
return ok ? Acceptable : Intermediate;
}
if (entered >= 0) {
// the -entered < b condition is necessary to allow people to type
// the minus last (e.g. for right-to-left languages)
// The buffLength > tLength condition validates values consisting
// of a number of digits equal to or less than the max value as intermediate.
int buffLength = buff.size();
if (startsWithPlus)
buffLength--;
const int tLength = t != 0 ? static_cast<int>(std::log10(qAbs(t))) + 1 : 1;
return (entered > t && -entered < b && buffLength > tLength) ? Invalid : Intermediate;
} else {
return (entered < b) ? Invalid : Intermediate;
}
}
Если вы хотите достичь своей цели, проверяя целое число в диапазоне, лучше позволить пользователю вводить что угодно, кроме букв и специальных символов (- + должен быть разрешенным в качестве первого символа) с использованием RegExpValidator и подписаться на сигналы editFinished и activeFocusChanged, чтобы при нажатии пользователем клавиши ввода или выхода из поля TextInput можно было самостоятельно проверить входное значение и даже обновить его до желаемого диапазона.