子类化Q(Double)SpinBox:重新实现valueFormText()和validate()

时间:2012-04-11 10:15:55

标签: qt validation qt4 range qspinbox

对于模糊的标题感到抱歉。

目前,如果将值输入到超出其范围的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仍然会以旧方式运行。

欢迎修改我自己的方法或不同的方法解决这个问题!谢谢你的时间。

2 个答案:

答案 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的值。 (因此,它不足以满足我的需求,只需将其留在这里作为参考。)