抱歉标题含糊。
目前,如果在 Q(Double)SpinBox 中输入超出其范围的值(例如,当最大值为 90 时输入“100”),则该值将被拒绝,而是将最后一个有效值放回 SpinBox。
我想更改此行为以允许键入将自动更正的超出范围的值(最小或最大值),否则用户将很难猜测值范围。在研究了 QT 的文档和源代码后,我决定将 QSpinBox(稍后将处理 Double 变体)子类化为“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() 更改为始终返回 Acceptable,但奇怪的是,生成的 spinbox 仍会以旧方式运行。
欢迎更正我自己的方法或解决此问题的不同方法!感谢您的时间。