我有一个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
不是我需要的吗?它只用于打字预防吗?我是否需要收听更改事件,自行验证,如果无效则将其设置回来?
答案 0 :(得分:-2)
因此,尝试编译代码对我来说不起作用。 const
中虚函数的QValidator
使得编译示例代码几乎不可能。
所以我会(就像你在问题的最后提到的那样)设置一个信号来响应你QLineEdit
的内容变化,评估它,然后把输出放在有用的地方。
但是根据你在evalPointF
函数中添加的内容,看起来你只是在编写一个用于javascript的IDE。
为什么不使用大多数IDE已经将问题放在另一个窗口中的模式,并使用字体和格式来修改文本,而不是实际更改文本?
希望有所帮助。