D
Dragon001May 3, 2017, 7:38 p.m.

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

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

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

8
Evgenii Legotckoi
  • May 3, 2017, 9:10 p.m.

Да. Нужно наследоваться от класса 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
    • May 3, 2017, 11:30 p.m.

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

      Evgenii Legotckoi
      • May 4, 2017, 10:35 a.m.
      • The answer was marked as a solution.

      Кроме как сделать кастомный класс, наследованный от 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
        • May 4, 2017, 5:06 p.m.

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

          Evgenii Legotckoi
          • May 4, 2017, 5:29 p.m.

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

            D
            • May 4, 2017, 5:50 p.m.

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

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

              Подскажете пожалуйста как можно сделать. Я просто не знаком с методами, которыми можно перересовывать виджет, и методами, при перелистывании месяцев в календаре загружать данные, какие месяцы делать не активными. Приведите пример кода, чтобы можно было попробовать сделать такой календарь.
              Спасибо.
                Evgenii Legotckoi
                • July 15, 2018, 12:56 a.m.

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

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


                  Comments

                  Only authorized users can post comments.
                  Please, Log in or Sign up
                  Ua

                  Qt - Test 001. Signals and slots

                  • Result:84points,
                  • Rating points4
                  Ua

                  Qt - Test 001. Signals and slots

                  • Result:42points,
                  • Rating points-8
                  ОК

                  Qt - Test 001. Signals and slots

                  • Result:47points,
                  • Rating points-6
                  Last comments
                  ИМ
                  Игорь МаксимовNov. 22, 2024, 9:51 p.m.
                  Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                  Evgenii Legotckoi
                  Evgenii LegotckoiOct. 31, 2024, 11:37 p.m.
                  Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                  A
                  ALO1ZEOct. 19, 2024, 5:19 p.m.
                  Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                  ИМ
                  Игорь МаксимовOct. 5, 2024, 4:51 p.m.
                  Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                  d
                  dblas5July 5, 2024, 8:02 p.m.
                  QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                  Now discuss on the forum
                  f
                  firstlunoxodFeb. 15, 2025, 1:46 p.m.
                  Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                  Дмитрий
                  ДмитрийFeb. 3, 2025, 4:24 p.m.
                  Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                  NW
                  Nayo WaiJan. 30, 2025, 7:22 p.m.
                  не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                  n
                  nklyJan. 3, 2025, 12:52 p.m.
                  Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                  M
                  MarselAug. 17, 2023, 12:26 a.m.
                  OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

                  Follow us in social networks