1

抱歉标题含糊。

目前,如果在 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 仍会以旧方式运行。

欢迎更正我自己的方法或解决此问题的不同方法!感谢您的时间。

4

2 回答 2

3

您尝试重新实现的方法的签名是:

QValidator::State validate(QString & input,int & pos) const # <- const!
int valueFromText(const QString & text) const # <- const!

您的两个方法都缺少 const,因此它们是不同的方法,因此从未从基类中调用。

于 2012-04-11T14:23:11.947 回答
0

换一种说法,

QAbstractSpinButton::setCorrectionMode(QAbstractSpinBox::CorrectToNearestValue)

可以达到类似的结果(输入小于 min 的值将被更正为 min),尽管由于验证器,您仍然无法输入大于 max 的值。(因此它不足以满足我的需要,只是留在这里供参考。)

于 2012-04-12T14:26:58.910 回答