У меня есть QLineEdit
который принимает string
которая будет оцениваться в выражении javascript, например "[0,3]" и связана с изменениями огня с помощью editingFinished()
. Я добавил валидатор, чтобы пользователь не мог оставить вход с плохим выражением, но, видимо, я не понимаю, как работает валидатор, потому что если я QValidator::Invalid
, когда выражение не будет действительным, t введите любые ошибки (символ не исчезнет в обратном пространстве). Например, временно меняя "[0,3]" на "[0,]", чтобы заполнить другой номер.
Я пробовал изменить валидатор, чтобы вернуться в QValidator::Intermediate
на плохих выражениях, думая, что это будет счастливым пользователем среды письма, который меняет текст, но возвращает 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
в свою функцию evalPointF
, похоже, что вы просто пишете IDE для javascript.
Почему бы не использовать шаблон, который большинство IDE уже имеет, чтобы помещать проблемы в другое окно, а также использовать шрифт и форматирование для изменения текста вместо фактического изменения текста?
Надеюсь, это поможет.