Я хочу реализовать QlineEdit в Qt, который будет иметь маску ввода «00/00/0000» (мм / дд / гггг), а также действительное регулярное выражение, чтобы проверить, вводит ли пользователь действительную дату или нет. Ниже мой код, но он не работает. Может ли кто-нибудь мне помочь?
QString str1 = "(0[1-9]|1[012])";
QString str2 = "(0[1-9]|[12][0-9]3[01])";
QString str3 = "(19|20)[0-9][0-9]";
QRegExp ipRegex ("^" + str1
+ "\/" + str2
+ "\/" + str3
+ "$");
QRegExpValidator *ipValidator = new QRegExpValidator(ipRegex, this);
ui->lineEdit->setValidator(ipValidator);
ui->lineEdit->setInputMask("00/00/0000");
// Avoid having to move cursor before typing
ui->lineEdit->setCursorPosition(0);
QDateEdit можно использовать, но я хочу использовать QlIneEdit, поскольку в этом QLineedit требуется несколько настроек, которые не могут быть достигнуты с помощью QDateEdit.
Похоже, в QString str2 = "(0[1-9]|[12][0-9]3[01])"; допущена опечатка. Разве это не должно быть "(0[1-9]|[12][0-9]|3[01])"? (Пропал последний |.) Кстати. Regex 101 - хороший онлайн-отладчик reg-ex.
Согласно Класс QRegExpValidator: регулярное выражение обрабатывается так, как если бы оно начинается с утверждения начала строки (^) и заканчивается утверждением конца строки ($); Возможно, проблема в том, что вы тоже это сделали. Я мог представить, что это может предотвратить возврат Средний, который может быть фатальным для принятия любого ввода. (Это просто выстрел в синий цвет - у меня нет опыта работы с этим.)





Это сработало для меня.
QRegExp ipRegex ("(0[1-9]|[12][0-9]|3[01]{1,2})/(0[1-9]|[12]{1,2})/(19[0-9][0-9]|20[0-9][0-9])");
Было бы хорошо объяснить, почему это работает и почему OP нет.
Это не работает для dd:10:yyyy. не могу установить 10 на месяц ...
Предлагаю вам попробовать этот code:
// Set date validator for date lineedit
QRegExp R_date("(0[1-9]|[12][0-9]|3[01])/(0[1-9]|[1][0-2])/(19[0-9][0-9]|20[0-9][0-9])");
QRegExpValidator *valida = new QRegExpValidator(R_date, this);
ui->lineEdit->setValidator(valida);
// Set place holder for date lineedit
ui->lineEdit->setPlaceholderText("Example : 21/05/2019");
Это будет примерно так:
Быстрый вопрос, знаете ли вы, почему это работает в QT, но не на упомянутом выше веб-сайте regex101? QT использует полууникальный способ форматирования регулярных выражений?
@bluejambo Попробуй этот (0[1-9]|[12][0-9]|3[01])/(0[1-9]|[1][0-2])/(19[0-9][0-9]|20[0-9][0-9]) в regex101.com
Спасибо, это работает, вы случайно не знаете, почему QT не нужна обратная косая черта?
Почему вы не используете QDateEdit?