允许仅在QDoubleValidator范围内输入QLineEdit

nic*_*ole 6 c++ validation qt qlineedit

我有一组QLineEdits应该接受一定范围内的双重值(例如,-15到15).

在设置每个时,我有以下几点:

lineEdit->setValidator(new QDoubleValidator(minVal, maxVal, 5, lineEdit));
Run Code Online (Sandbox Code Playgroud)

理想情况下,行编辑可以使用,只能输入范围内的值.当我尝试这个时,我注意到只有数字可以根据需要输入,但它们仍然可以超出范围.

如何动态强制输入以适应范围(例如,如果范围是-15到15并且用户键入1,则尝试键入9,它不起作用/显示9 ...但键入1然后2确实工作/显示2.)?

我是否需要在validate()某处连接并调用该功能?

VVV*_*VVV 10

这是因为QDoubleValidator返回QValidator::Intermediate值是否超出界限的和QLineEdit接受QValidator::Intermediate的值.

要实现您想要的行为,您可以QDoubleValidator像这样创建自己的子类:

class MyValidator : public QDoubleValidator
{
public:
    MyValidator(double bottom, double top, int decimals, QObject * parent) :
        QDoubleValidator(bottom, top, decimals, parent)
    {
    }

    QValidator::State validate(QString &s, int &i) const
    {
        if (s.isEmpty()) {
            return QValidator::Intermediate;
        }

        bool ok;
        double d = s.toDouble(&ok);

        if (ok && d > 0 && d < 15) {
            return QValidator::Acceptable;
        } else {
            return QValidator::Invalid;
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

更新:这将解决负号问题,也将接受语言环境双重格式:

class MyValidator : public QDoubleValidator
{
public:
    MyValidator(double bottom, double top, int decimals, QObject * parent) :
        QDoubleValidator(bottom, top, decimals, parent)
    {
    }

    QValidator::State validate(QString &s, int &i) const
    {
        if (s.isEmpty() || s == "-") {
            return QValidator::Intermediate;
        }

        QChar decimalPoint = locale().decimalPoint();

        if(s.indexOf(decimalPoint) != -1) {
            int charsAfterPoint = s.length() - s.indexOf(decimalPoint) - 1;

            if (charsAfterPoint > decimals()) {
                return QValidator::Invalid;
            }
        }

        bool ok;
        double d = locale().toDouble(s, &ok);

        if (ok && d >= bottom() && d <= top()) {
            return QValidator::Acceptable;
        } else {
            return QValidator::Invalid;
        }
    }
};
Run Code Online (Sandbox Code Playgroud)