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

0

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

Теги:
validation
qt
qlineedit

1 ответ

-3

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

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

Но, основываясь на тех вещах, которые вы evalPointF в свою функцию evalPointF, похоже, что вы просто пишете IDE для javascript.

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

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

  • 1
    Я оцениваю одно выражение JavaScript в однострочном вводе текста, и вы предполагаете, что я пишу IDE? Как я уже сказал, у меня уже есть входные данные, но я хочу предварительно проверить данные, используя механизмы Qt.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню