QValidator可防止中间输入

时间:2013-12-21 16:42:49

标签: c++ qt validation qlineedit

我有一个QLineEdit接受string,它将在类似“[0,3]”的javascript表达式中进行评估,并使用editingFinished()连接到火灾更改。我添加了一个验证器,因此用户无法使用错误的表达式留下输入,但显然我误解了验证器的工作原理,因为如果我返回QValidator::Invalid,当表达式无效时,用户可以输入任何错误(字符不会在退格时消失)。例如,暂时将“[0,3]”更改为“[0,]”以填写另一个数字。

我已经尝试更改验证程序,以便在错误的表达式上返回QValidator::Intermediate,认为这是一个快乐的中等字母用户改变文本,但是将不良文本设置回未聚焦或返回时的先前值,但似乎让用户放入任何想要的东西。例如,他们可以输入“[0,”并点击其他内容,输入仍然有“[0,”而不是跳回原来的方式。我误解了中间类型是如何工作的吗?

QValidator::Invalid         0   The string is clearly invalid.
QValidator::Intermediate    1   The string is a plausible intermediate value.
QValidator::Acceptable      2   The string is acceptable as a final result; 

即。这是有效的。

这是我当前的验证器,我刚刚放在QLineEdit

class PointFValidator : public QValidator
{
    QValidator::State validate(QString &input, int &position) const;
    void fixup(QString &input) const;
};

QValidator::State PointFValidator::validate(QString &input, int &position) const
{
    try {
        evalPointF(input);
    } catch (std::exception &e) {
        return QValidator::Invalid;
    }

    return QValidator::Acceptable;
}

void PointFValidator::fixup(QString &input) const
{
}

这就是实际测试字符串以查看其格式是否正确的原因

QPointF evalPointF(QString s)
{
    //initGuile();

    QScriptEngine engine;
    QString program = "function frame() { return 9; }\n\n" + s;
    QScriptValue value = engine.evaluate(program);

    QStringList pair = value.toString().split(",");
    if (pair.length() < 2)
        throw std::runtime_error("invalid pointf string");

    return QPointF(pair[0].toFloat(), pair[1].toFloat());
}

QValidator不是我需要的吗?它只用于打字预防吗?我是否需要收听更改事件,自行验证,如果无效则将其设置回来?

1 个答案:

答案 0 :(得分:-2)

因此,尝试编译代码对我来说不起作用。 const中虚函数的QValidator使得编译示例代码几乎不可能。

所以我会(就像你在问题的最后提到的那样)设置一个信号来响应你QLineEdit的内容变化,评估它,然后把输出放在有用的地方。

但是根据你在evalPointF函数中添加的内容,看起来你只是在编写一个用于javascript的IDE。

为什么不使用大多数IDE已经将问题放在另一个窗口中的模式,并使用字体和格式来修改文本,而不是实际更改文本?

希望有所帮助。