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

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

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

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

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

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

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

А реализация LoginValidator такова:

class LoginValidator : public QRegExpValidator
{
    Q_OBJECT
public:

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

person horseyguy    schedule 10.04.2019    source источник
comment
@eyllanescis не это ли именно то, что я использую? я не вижу разницы между вашим регулярным выражением и моим ????   -  person horseyguy    schedule 10.04.2019
comment
@eyllanesc хм, похоже, это не опечатка, все работает отлично ... это просто необработанное регулярное выражение, которое regExp принимает   -  person horseyguy    schedule 10.04.2019


Ответы (1)


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

QValidator::State LoginValidator::validate(QString &input, int &pos) const
{
  fixup(input);
  return QRegExpValidator::validate(input, pos);
}
person tomvodi    schedule 11.04.2019
comment
Чувак ты ГЕНИЙ! Спасибо! - person horseyguy; 12.04.2019
comment
Хороший обходной путь, но он вообще не нужен. Пожалуйста, отправьте отчет об ошибке любого виджета/компонента QQ2, который вы используете для ввода текста. - person peppe; 13.04.2019