D
Dragon0013 мая 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 г. 13:30

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

      Evgenii Legotckoi
      • 4 мая 2017 г. 0: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 г. 14:56

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

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


                  Комментарии

                  Только авторизованные пользователи могут публиковать комментарии.
                  Пожалуйста, авторизуйтесь или зарегистрируйтесь
                  AD

                  C++ - Тест 004. Указатели, Массивы и Циклы

                  • Результат:50баллов,
                  • Очки рейтинга-4
                  m
                  • molni99
                  • 26 октября 2024 г. 1:37

                  C++ - Тест 004. Указатели, Массивы и Циклы

                  • Результат:80баллов,
                  • Очки рейтинга4
                  m
                  • molni99
                  • 26 октября 2024 г. 1:29

                  C++ - Тест 004. Указатели, Массивы и Циклы

                  • Результат:20баллов,
                  • Очки рейтинга-10
                  Последние комментарии
                  i
                  innorwall14 ноября 2024 г. 19:03
                  Qt/C++ - Урок 060. Настройка внешнего вида приложения в рантайме I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
                  i
                  innorwall14 ноября 2024 г. 11:42
                  Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
                  i
                  innorwall14 ноября 2024 г. 9:09
                  Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
                  i
                  innorwall14 ноября 2024 г. 4:05
                  EVILEG-CORE. Использование Google reCAPTCHA 2001; 98 29 34 priligy buy
                  Сейчас обсуждают на форуме
                  i
                  innorwall14 ноября 2024 г. 3:39
                  добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
                  i
                  innorwall11 ноября 2024 г. 10:55
                  Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                  9
                  9Anonim25 октября 2024 г. 9:10
                  Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                  ИМ
                  Игорь Максимов3 октября 2024 г. 4:05
                  Реализация навигации по разделам Спасибо Евгений!

                  Следите за нами в социальных сетях