Маска ввода и валидатор для даты в QlineEdit

Я хочу реализовать 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?

eyllanesc 04.12.2018 12:24

QDateEdit можно использовать, но я хочу использовать QlIneEdit, поскольку в этом QLineedit требуется несколько настроек, которые не могут быть достигнуты с помощью QDateEdit.

Raghaw Shukla 04.12.2018 13:20

Похоже, в QString str2 = "(0[1-9]|[12][0-9]3[01])"; допущена опечатка. Разве это не должно быть "(0[1-9]|[12][0-9]|3[01])"? (Пропал последний |.) Кстати. Regex 101 - хороший онлайн-отладчик reg-ex.

Scheff's Cat 05.12.2018 11:01

Согласно Класс QRegExpValidator: регулярное выражение обрабатывается так, как если бы оно начинается с утверждения начала строки (^) и заканчивается утверждением конца строки ($); Возможно, проблема в том, что вы тоже это сделали. Я мог представить, что это может предотвратить возврат Средний, который может быть фатальным для принятия любого ввода. (Это просто выстрел в синий цвет - у меня нет опыта работы с этим.)

Scheff's Cat 05.12.2018 11:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
1 996
2

Ответы 2

Это сработало для меня.

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 нет.

DCTID 03.08.2019 01:08

Это не работает для dd:10:yyyy. не могу установить 10 на месяц ...

BattleTested_закалённый в бою 14.10.2019 12:17

Предлагаю вам попробовать этот 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 04.08.2021 14:07

@bluejambo Попробуй этот (0[1-9]|[12][0-9]|3[01])/(0[1-9]|[1][0-2])/(19[0-9][0-9]|2‌​0[0-9][0-9]) в regex101.com

BattleTested_закалённый в бою 07.08.2021 15:11

Спасибо, это работает, вы случайно не знаете, почему QT не нужна обратная косая черта?

bluejambo 09.08.2021 08:03

Другие вопросы по теме