对于模糊的标题感到抱歉。
目前,如果将值输入到超出其范围的Q(Double)SpinBox中(例如,当max为90时键入“100”),则拒绝该值,而将最后一个有效值放回到纺纱器。
我想更改此行为以允许键入超出范围的值,这些值将自动更正(最小值或最大值),否则用户猜测值范围将非常困难。在研究了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仍然会以旧方式运行。
欢迎修改我自己的方法或不同的方法解决这个问题!谢谢你的时间。
答案 0 :(得分:3)
您尝试重新实现的方法的签名是:
QValidator::State validate(QString & input,int & pos) const # <- const!
int valueFromText(const QString & text) const # <- const!
你的方法都缺少const,因此它们是不同的方法,因此从不从基类调用。
答案 1 :(得分:0)
另一方面,
QAbstractSpinButton::setCorrectionMode(QAbstractSpinBox::CorrectToNearestValue)
可以实现一些类似的结果(小于min的输入值将被修正为min),尽管由于验证器仍然无法输入大于max的值。 (因此,它不足以满足我的需求,只需将其留在这里作为参考。)