QValidator предотвращает промежуточную типизацию

у меня есть 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 не то, что мне нужно? Это только для предотвращения ввода? Нужно ли мне слушать событие изменения, проверять его самостоятельно и устанавливать его обратно, если оно недействительно?

0

Решение

Поэтому попытка скомпилировать ваш код не сработала для меня. constВиртуальные функции в QValidator сделать практически невозможным, чтобы ваш пример кода компилировался.

Поэтому я хотел бы (как вы упомянули в конце вашего вопроса) пойти и настроить сигнал, чтобы ответить на изменения содержания вашего QLineEdit, оцените это, и затем поместите вывод куда-нибудь полезный.

Но в зависимости от того, что вы вкладываете в evalPointF Похоже, вы просто пишете IDE для JavaScript.

Почему бы не использовать шаблон, который уже есть в большинстве сред IDE, для помещения проблем в другое окно и использования шрифтов и форматирования для изменения текста вместо фактического изменения текста?

Надеюсь, это поможет.

-2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]