【发布时间】: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