【问题标题】:QValidator prevents intermediate typingQValidator 防止中间类型
【发布时间】:2013-12-21 16:42:49
【问题描述】:

我有一个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 不是我需要的吗?只是为了防止打字吗?我是否需要监听 change 事件,自己验证它,如果它无效则将其设置回来?

【问题讨论】:

    标签: c++ qt validation qlineedit


    【解决方案1】:

    所以尝试编译您的代码对我不起作用。 QValidator 中的虚函数 constness 使您的示例代码几乎无法编译。

    所以我会(就像你在问题末尾提到的那样)去设置一个信号来响应你的 QLineEdit 的内容更改,对其进行评估,然后将输出放在有帮助的地方。

    但根据您在 evalPointF 函数中添加的内容,您似乎只是在为 javascript 编写 IDE。

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

    希望对您有所帮助。

    【讨论】:

    • 我正在评估单行文本输入中的一个 JavaScript 表达式,而您认为我正在编写一个 IDE?正如我所说,我已经连接了输入,但想使用 Qt 的机制预先验证数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 2017-11-22
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多