Извините за смутное название.Подкласс Q (Double) SpinBox: reimplement valueFormText() и validate()
В настоящее время, если значение вводится в Q (Double) SpinBox, который выходит за пределы его диапазона (например, ввод «100», когда max равен 90), значение отклоняется и вместо этого последнее действительное значение помещается обратно SpinBox.
Я хочу изменить это поведение, чтобы можно было вводить значения вне диапазона, которые будут автоматически исправлены (минимальны или максимальны), поскольку в противном случае было бы глупо усложнять пользователю диапазон значений. Изучив документы и исходный код QT, я решил подклассифицировать QSpinBox (будет иметь дело с двойным вариантом позже) в «QSpinBoxFS» и переопределить оба метода, упомянутые в названии. Так или иначе, это не имеет никакого эффекта, поведение по-прежнему остается прежним.
Это мои методы:
QValidator::State QSpinBoxFS::validate(QString &input,
int &pos)
{
QIntValidator *validator = new QIntValidator();
return validator->validate(input, pos);
}
int QSpinBoxFS::valueFromText(const QString &text)
{
const int max = maximum();
const int min = minimum();
QString copy = text;
int dummy = 0;
QValidator::State state = validate(copy, dummy);
if (state == QValidator::Acceptable)
{
bool ok;
int num = locale().toInt(text, &ok, 10);
if (!ok) { goto bad_text; }
if (num < min) { return min; }
if (num > max) { return max; }
return num;
}
else
{
bad_text:
return (max > 0) ? min : max;
}
}
Конечно, это не совсем адекватна педантичный проверка осуществляется в QSpinBoxPrivate :: validateAndInterpret, но я просто хочу, основная концепция работает в настоящее время. Я попытался изменить validate(), чтобы всегда возвращать приемлемый, но, как ни странно, полученные спинбоксы по-прежнему будут вести себя по-старому.
Либо исправление моих собственных методов, либо другой подход к этой проблеме приветствуются! Спасибо за ваше время.
'goto bad_text;' .... \ * shiver \ * –
Кроме того .. Если это всего лишь гадание диапазона значений: В некоторых наших приложениях мы предлагаем наконечник инструмента, например диапазон значений и действительный масштаб (например, если вы можете вводить только значения, делящиеся на 0,1). Конечно, это не подходит для каждого приложения. –
@Tim Meyer Cmon, по крайней мере, я придерживаюсь только переходов вперед = P и подсказка инструмента, конечно, возможность, но я просто нахожу это странно контр-интуитивным, если я вводим значение вне диапазона, а отображаемое значение просто возвращается к старому. – Ancurio