D
Dragon001Мамыр 3, 2017, 9:38 Т.Ж.

Как сделать пустое поле в QDateEdit

Здравствуйте, если ли возможность сделать QDateEdit пустой? Мне нужно, чтобы начальное значение было пусто, а после можем выбрать надо если надо. Везде пишут по разному,кто-то переопределяет,кто-то объединяет, но у меня не хватает к сожалению опыта, подскажите пожалуйста как это сделать?

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

8
Evgenii Legotckoi
  • Мамыр 3, 2017, 11:10 Т.Ж.

Да. Нужно наследоваться от класса QDateEdit и переопределять метод paintEvent(). В самом просто вариант код будет выглядеть так:

Заголовочный файл
#ifndef CUSTOMDATEEDIT_H
#define CUSTOMDATEEDIT_H

#include <QDateEdit>

class CustomDateEdit : public QDateEdit
{
    Q_OBJECT
public:
    explicit CustomDateEdit(QWidget *parent = nullptr);
    virtual void paintEvent(QPaintEvent *event) override;

signals:

public slots:

private:
     // Переменная, которая сигнализирует, что пользователь изменил дату
    bool m_dateTimeWasChanged; 
};

#endif // CUSTOMDATEEDIT_H
Файл реализации
#include "customdatetime.h"

#include <QLineEdit>

CustomDateTime::CustomDateTime(QWidget *parent)
    : QDateEdit(parent),
      m_dateTimeWasChanged(false)
{
    // Подключаемся к сигналу изменения даты
    // И как только дата поменялась, устанавливаем переменную
    connect(this, &QDateEdit::dateChanged, [this](){
        m_dateTimeWasChanged = true;
    });
}

void CustomDateTime::paintEvent(QPaintEvent *event)
{
    // Пока переменная не была установлена
    if (!m_dateTimeWasChanged)
    {  
        // При отрисовке устанавливаем во внутренний lineEdit пустой текст
        lineEdit()->setText("");
    }
    // Отрисовываем оставшийся DateEdit
    QDateEdit::paintEvent(event);
}

Суть в том, что всякие QComboBox и QDateEdit имеют внутри себя QLineEdit , в который пишется текущий текст даты или чего-либо другого. И как правило этот QLineEdit является protected переменной, поэтому до неё не добраться, пока не наследуемся от класса, чтобы сделать что-то выходящее за рамки стандартного поведения QDateEdit .

    D
    • Мамыр 3, 2017, 1:30 Т.Қ.

    Это я вроде бы понял,спасибо большое, а возможно ли сделать,чтобы при открытие CalendarPopup устанавливалась текущая дата,? Я так думаю,это как-то так же делается,но не могу найти как отследить открытие данного календаря.

      Evgenii Legotckoi
      • Мамыр 4, 2017, 12:35 Т.Ж.
      • Жауап шешім ретінде белгіленді.

      Кроме как сделать кастомный класс, наследованный от QCalendarWidget, и переопределить метод showEvent(), чтобы из него испускать сигнал, который покажет, что виджет открылся, никаких мыслей у меня не появилось дополнительных. Довольно скудный функционал на этот счёт у этого класса.

      Заголовок класса
      #include <QCalendarWidget>
      
      class CustomCalendarWidget : public QCalendarWidget
      {
          Q_OBJECT
      public:
          CustomCalendarWidget(QWidget *parent = nullptr);
      
          virtual void showEvent(QShowEvent *event) override;
      
      signals:
          // Сигнал, который сообщит, что календарь видимый
          void shown();
      };
      Реализация класса
      #include <QShowEvent>
      
      CustomCalendarWidget::CustomCalendarWidget(QWidget *parent)
          : QCalendarWidget(parent)
      {
      
      }
      
      void CustomCalendarWidget::showEvent(QShowEvent *event)
      {
          // Если событие сообщает, что календарь стал видимым, то испускаем сигнал, что он видимый
          if (event->type() == QEvent::Show)
          {
              emit shown();
          }
          QCalendarWidget::showEvent(event);
      }
      Применение
      dateTime->setCalendarPopup(true);
      CustomCalendarWidget *calendar = new CustomCalendarWidget(this);
      dateTime->setCalendarWidget(calendar);
      
      // Как только календарь стал видимым
      connect(calendar, &CustomCalendarWidget::shown, [dateTime](){
          // Устанавливаем текущую дату
          dateTime->setDateTime(QDateTime::currentDateTime());
      });
        D
        • Мамыр 4, 2017, 7:06 Т.Ж.

        Спасибо большое очень помогли, я же правильно понял, что "Применение" нужно писать для в каждом классе, в котором я хочу это использовать?

          Evgenii Legotckoi
          • Мамыр 4, 2017, 7:29 Т.Ж.

          Да. Только не пытайтесь устанавливать calendarWidget внутри класса CustomDateEdit. Работает неправильно. Он тогда будет виден внутри CustomDateEdit вместо строки редактирования.

            D
            • Мамыр 4, 2017, 7:50 Т.Ж.

            Спасибо еще раз, я уже пробовал встроит и уже убедился в том, что строка заменяется

              E
              • Шілде 12, 2018, 9:31 Т.Ж.
              Вопрос про QCalendarWidget.
              Скажите как можно сделать, чтобы определённые числа в календаре были не активные ( не активные числа, как от предыдущего месяца, которые показываются в текущем месяце), и их нельзя было выбрать, и при перелистывании месяцев в пределе одного года загружались даты, которые должны быть неактивными. Я хочу сделать при выборе даты в календаре загрузку данных из базы. Если в базе нету определённой даты, в календаре тоже этой даты не было (дата была серым цветом и её нельзя было выбрать).
              Даты для каждого месяца можно хранить в своём QList<QDate> например. Не знаю, как лучше, хранить все даты разных месяцев в одной переменной или для каждого месяца делать свою переменную, и при перелистывании месяцев в календаре загружать даты, которые должны быть неактивными.

              Подскажете пожалуйста как можно сделать. Я просто не знаком с методами, которыми можно перересовывать виджет, и методами, при перелистывании месяцев в календаре загружать данные, какие месяцы делать не активными. Приведите пример кода, чтобы можно было попробовать сделать такой календарь.
              Спасибо.
                Evgenii Legotckoi
                • Шілде 14, 2018, 2:56 Т.Қ.

                Слишком много возни, чтобы подробно объяснить, что нужно сделать.... тем более, что у вас ещё зависимость на базу данных...

                Для начала нужно наследоваться от QCalendarWidget, поскольку у него нет в принципе такого функционала, который вы хотите реализовать.
                Поэтому нужно наследоваться и копать в сторону делегата для самих дней даты, думаю, что если вы будете иметь установленный Qlist<Date> в вашем наследованном QCaledarWidget`е, то через делегат как-то можно будет определить, есть ли дата или нет и соответствующим образом запретить  или разрешить выбор, ну и соответсвующее оформление включить, либо выключить, также через делегат можно будет.
                Но это не на один час работы...


                  Пікірлер

                  Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                  Кіріңіз немесе Тіркеліңіз
                  Г

                  C++ - Тест 001. Первая программа и типы данных

                  • Нәтиже:66ұпай,
                  • Бағалау ұпайлары-1
                  t

                  C++ - Тест 001. Первая программа и типы данных

                  • Нәтиже:33ұпай,
                  • Бағалау ұпайлары-10
                  t

                  Qt - Тест 001. Сигналы и слоты

                  • Нәтиже:52ұпай,
                  • Бағалау ұпайлары-4
                  Соңғы пікірлер
                  G
                  GoattRockҚыр. 3, 2024, 10:50 Т.Ж.
                  Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
                  d
                  dblas5Шілде 5, 2024, 8:02 Т.Ж.
                  QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                  k
                  kmssrАқп. 8, 2024, 3:43 Т.Қ.
                  Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                  АК
                  Анатолий КононенкоАқп. 4, 2024, 10:50 Т.Қ.
                  Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                  Енді форумда талқылаңыз
                  Evgenii Legotckoi
                  Evgenii LegotckoiМаусым 24, 2024, 12:11 Т.Қ.
                  добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                  F
                  FynjyШілде 22, 2024, 1:15 Т.Ж.
                  при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
                  BlinCT
                  BlinCTМаусым 24, 2024, 10 Т.Қ.
                  Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
                  BlinCT
                  BlinCTМамыр 5, 2024, 2:46 Т.Ж.
                  Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                  Evgenii Legotckoi
                  Evgenii LegotckoiМамыр 2, 2024, 11:07 Т.Ж.
                  Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

                  Бізді әлеуметтік желілерде бақылаңыз