у меня есть QLineEdit
который принимает string
это будет оценено в выражении javascript, таком как «[0,3]», и будет связано с изменениями при использовании 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
не то, что мне нужно? Это только для предотвращения ввода? Нужно ли мне слушать событие изменения, проверять его самостоятельно и устанавливать его обратно, если оно недействительно?
Поэтому попытка скомпилировать ваш код не сработала для меня. const
Виртуальные функции в QValidator
сделать практически невозможным, чтобы ваш пример кода компилировался.
Поэтому я хотел бы (как вы упомянули в конце вашего вопроса) пойти и настроить сигнал, чтобы ответить на изменения содержания вашего QLineEdit
, оцените это, и затем поместите вывод куда-нибудь полезный.
Но в зависимости от того, что вы вкладываете в evalPointF
Похоже, вы просто пишете IDE для JavaScript.
Почему бы не использовать шаблон, который уже есть в большинстве сред IDE, для помещения проблем в другое окно и использования шрифтов и форматирования для изменения текста вместо фактического изменения текста?
Надеюсь, это поможет.
Других решений пока нет …