LINUX.ORG.RU

Qt делегат

 


0

1

Для поля email некоторого столбца написал делегата, в котором используется lineEditor типа QLineEdit с валидатором (рег. выражение упрощено):

QRegExp rxe("^[a-z]+@[a-z]+$");
QValidator *validator = new QRegExpValidator(rxe,parent);
lineEditor->setValidator(validator);

В делегате это код работает в методах: createEditor, setEditorData, setModelData. Валидатор не пускает лишние символы, все+. Но, если прекратить редактирование и выполнить commit, то может сохраниться и неверный емайл, например без @. Вопрос: как в пределах класса делегата (думаю в setModelData) не дать невалидному тексту сохраниться?



Последнее исправление: developer-cpp (всего исправлений: 5)

Не проверять email регулярками. Some people, when confronted with a problem, think «I know, I'll use regular expressions.» Now they have two problems.

anonymous
()

Я еле врубился, что ж происходит. Мне кажется, чтобы было всё красиво, придётся унаследовать QLineEdit и впилить валидацию более глубоко.

Adonai ★★★
()
Ответ на: комментарий от risenshnobel

Даже там не до конца - по ссылке написано: The regular expression does not cope with comments in email addresses. The RFC allows comments to be arbitrarily nested. A single regular expression cannot cope with this. The Perl module pre-processes email addresses to remove comments before applying the mail regular expression. Кроме того на этот стандарт большинство серверов срали, поэтому лучший способ валидировать email - послать туда проверочное письмо. Максимум локально проверить email.contains(«@»).

anonymous
()
Ответ на: комментарий от anonymous

кстати, на самом деле мне идеально бы подходил InputMask, так как почта д.б. корпоративной ivanov_i_i@corporat.ru. Причем есть даже точные ограничения на почтовом сервере.

Но, не удобно использовать InputMask в этом случае. Например, пришу xxxxxxxxxxx@corporat.ru;_ - и при использовании это даже работает, но будет неудобно пользователю логином точно попадать до знака @ (иначе пробел попадает).

Другими словами сейчас выглядит так:

ivanov_i_i________@corporat.ru

а хотелось бы, чтобы вот так логин выравнивался автоматом:

________ivanov_i_i@corporat.ru

developer-cpp
() автор топика
Ответ на: комментарий от developer-cpp

developer.cpp_try-that@copro.ru хотя если «есть даже точные ограничения»...

I-Love-Microsoft ★★★★★
()

У тебя как минимум две ошибки в ДНК: CPP & Qt.

anonymous
()

Я вот не совсем понял, почему может сохраниться неверный e-mail? Ты же в методе setModelData сам можешь проверить, валидное поле, или нет. Если невалидное, показывай предупреждающее сообщение и сбрасывай значение поля.

pathfinder ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.