Как мне заставить QT-валидатор корректно работать при вставке текста?

#qt #qml #qt5 #qvalidator

#qt #qml #qt5 #qvalidator

Вопрос:

У меня есть QT QRegExpValidator ( RegExpValidator в QML), который ограничивает ввод текста только буквенно-цифровым содержимым.

Однако, когда пользователи вставляют строки в my TextField , иногда эти строки заканчиваются символом новой строки, что приводит к сбою проверки, и поэтому строка никогда не вставляется.

Я читал, что реализация fixup метода дает вам возможность очистить строки, чтобы они правильно работали с валидатором. Однако, похоже, это не работает при вставке — строки по-прежнему не вставляются.

Как мне заставить это работать так, как я хочу?

Мой код выглядит следующим образом:

 LoginValidator { id: alphaNumValidator; regExp: /(?:[0-9A-Za-z]) $/ }
  

И LoginValidator реализация выглядит следующим образом:

 class LoginValidator : public QRegExpValidator
{
    Q_OBJECT
public:

    virtual void fixup(QString amp;input) const override
    {
        input = input.simplified().remove(' ');
    }
};
  

Комментарии:

1. @eyllanescis разве это не то, что я использую? я не вижу разницы между вашим регулярным выражением и моим 😅

2. @eyllanesc хм, похоже, это не опечатка, все работает просто отлично… это просто необработанное регулярное выражение, которое regExp принимает

Ответ №1:

Похоже, что fixup метод не вызывается в validate методе a QRegExpValidator . Чтобы заставить это работать, мне пришлось переопределить validate метод и вызвать там метод fixup перед вызовом родительского validate метода.

 QValidator::State LoginValidator::validate(QString amp;input, int amp;pos) const
{
  fixup(input);
  return QRegExpValidator::validate(input, pos);
}
  

Комментарии:

1. Чувак, ты ГЕНИЙ! Спасибо!

2. Хороший обходной путь, но он вообще не нужен. Пожалуйста, отправьте отчет об ошибке в отношении любого компонента widget / QQ2, который вы используете для ввода текста.