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`е, то через делегат как-то можно будет определить, есть ли дата или нет и соответствующим образом запретить  или разрешить выбор, ну и соответсвующее оформление включить, либо выключить, также через делегат можно будет.
                Но это не на один час работы...


                  Пікірлер

                  Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                  Кіріңіз немесе Тіркеліңіз
                  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
                  Соңғы пікірлер
                  ИМ
                  Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
                  Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                  Evgenii Legotckoi
                  Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
                  Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                  A
                  ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
                  Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                  ИМ
                  Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
                  Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                  d
                  dblas5Шілде 5, 2024, 11:02 Т.Ж.
                  QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                  Енді форумда талқылаңыз
                  m
                  moogoҚар. 22, 2024, 7:17 Т.Ж.
                  Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
                  Evgenii Legotckoi
                  Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                  добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                  t
                  tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
                  google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                  NSProject
                  NSProjectМаусым 4, 2022, 3:49 Т.Ж.
                  Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

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