1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtWidgets module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #ifndef QDATETIMEEDIT_H
41 #define QDATETIMEEDIT_H
42 
43 #include <QtWidgets/qtwidgetsglobal.h>
44 #include <QtCore/qdatetime.h>
45 #include <QtCore/qcalendar.h>
46 #include <QtCore/qvariant.h>
47 #include <QtWidgets/qabstractspinbox.h>
48 
49 QT_REQUIRE_CONFIG(datetimeedit);
50 
51 QT_BEGIN_NAMESPACE
52 
53 class QDateTimeEditPrivate;
54 class QStyleOptionSpinBox;
55 class QCalendarWidget;
56 
57 class Q_WIDGETS_EXPORT QDateTimeEdit : public QAbstractSpinBox
58 {
59     Q_OBJECT
60 
61     Q_PROPERTY(QDateTime dateTime READ dateTime WRITE setDateTime NOTIFY dateTimeChanged USER true)
62     Q_PROPERTY(QDate date READ date WRITE setDate NOTIFY dateChanged)
63     Q_PROPERTY(QTime time READ time WRITE setTime NOTIFY timeChanged)
64     Q_PROPERTY(QDateTime maximumDateTime READ maximumDateTime WRITE setMaximumDateTime RESET clearMaximumDateTime)
65     Q_PROPERTY(QDateTime minimumDateTime READ minimumDateTime WRITE setMinimumDateTime RESET clearMinimumDateTime)
66     Q_PROPERTY(QDate maximumDate READ maximumDate WRITE setMaximumDate RESET clearMaximumDate)
67     Q_PROPERTY(QDate minimumDate READ minimumDate WRITE setMinimumDate RESET clearMinimumDate)
68     Q_PROPERTY(QTime maximumTime READ maximumTime WRITE setMaximumTime RESET clearMaximumTime)
69     Q_PROPERTY(QTime minimumTime READ minimumTime WRITE setMinimumTime RESET clearMinimumTime)
70     Q_PROPERTY(Section currentSection READ currentSection WRITE setCurrentSection)
71     Q_PROPERTY(Sections displayedSections READ displayedSections)
72     Q_PROPERTY(QString displayFormat READ displayFormat WRITE setDisplayFormat)
73     Q_PROPERTY(bool calendarPopup READ calendarPopup WRITE setCalendarPopup)
74     Q_PROPERTY(int currentSectionIndex READ currentSectionIndex WRITE setCurrentSectionIndex)
75     Q_PROPERTY(int sectionCount READ sectionCount)
76     Q_PROPERTY(Qt::TimeSpec timeSpec READ timeSpec WRITE setTimeSpec)
77 public:
78     enum Section { // a sub-type of QDateTimeParser's like-named enum.
79         NoSection = 0x0000,
80         AmPmSection = 0x0001,
81         MSecSection = 0x0002,
82         SecondSection = 0x0004,
83         MinuteSection = 0x0008,
84         HourSection   = 0x0010,
85         DaySection    = 0x0100,
86         MonthSection  = 0x0200,
87         YearSection   = 0x0400,
88         TimeSections_Mask = AmPmSection|MSecSection|SecondSection|MinuteSection|HourSection,
89         DateSections_Mask = DaySection|MonthSection|YearSection
90     };
91     Q_ENUM(Section)
92 
93     Q_DECLARE_FLAGS(Sections, Section)
94     Q_FLAG(Sections)
95 
96     explicit QDateTimeEdit(QWidget *parent = nullptr);
97     explicit QDateTimeEdit(const QDateTime &dt, QWidget *parent = nullptr);
98     explicit QDateTimeEdit(const QDate &d, QWidget *parent = nullptr);
99     explicit QDateTimeEdit(const QTime &t, QWidget *parent = nullptr);
100     ~QDateTimeEdit();
101 
102     QDateTime dateTime() const;
103     QDate date() const;
104     QTime time() const;
105 
106     QCalendar calendar() const;
107     void setCalendar(QCalendar calendar);
108 
109     QDateTime minimumDateTime() const;
110     void clearMinimumDateTime();
111     void setMinimumDateTime(const QDateTime &dt);
112 
113     QDateTime maximumDateTime() const;
114     void clearMaximumDateTime();
115     void setMaximumDateTime(const QDateTime &dt);
116 
117     void setDateTimeRange(const QDateTime &min, const QDateTime &max);
118 
119     QDate minimumDate() const;
120     void setMinimumDate(const QDate &min);
121     void clearMinimumDate();
122 
123     QDate maximumDate() const;
124     void setMaximumDate(const QDate &max);
125     void clearMaximumDate();
126 
127     void setDateRange(const QDate &min, const QDate &max);
128 
129     QTime minimumTime() const;
130     void setMinimumTime(const QTime &min);
131     void clearMinimumTime();
132 
133     QTime maximumTime() const;
134     void setMaximumTime(const QTime &max);
135     void clearMaximumTime();
136 
137     void setTimeRange(const QTime &min, const QTime &max);
138 
139     Sections displayedSections() const;
140     Section currentSection() const;
141     Section sectionAt(int index) const;
142     void setCurrentSection(Section section);
143 
144     int currentSectionIndex() const;
145     void setCurrentSectionIndex(int index);
146 
147     QCalendarWidget *calendarWidget() const;
148     void setCalendarWidget(QCalendarWidget *calendarWidget);
149 
150     int sectionCount() const;
151 
152     void setSelectedSection(Section section);
153 
154     QString sectionText(Section section) const;
155 
156     QString displayFormat() const;
157     void setDisplayFormat(const QString &format);
158 
159     bool calendarPopup() const;
160     void setCalendarPopup(bool enable);
161 
162     Qt::TimeSpec timeSpec() const;
163     void setTimeSpec(Qt::TimeSpec spec);
164 
165     QSize sizeHint() const override;
166 
167     void clear() override;
168     void stepBy(int steps) override;
169 
170     bool event(QEvent *event) override;
171 Q_SIGNALS:
172     void dateTimeChanged(const QDateTime &dateTime);
173     void timeChanged(const QTime &time);
174     void dateChanged(const QDate &date);
175 
176 public Q_SLOTS:
177     void setDateTime(const QDateTime &dateTime);
178     void setDate(const QDate &date);
179     void setTime(const QTime &time);
180 
181 protected:
182     void keyPressEvent(QKeyEvent *event) override;
183 #if QT_CONFIG(wheelevent)
184     void wheelEvent(QWheelEvent *event) override;
185 #endif
186     void focusInEvent(QFocusEvent *event) override;
187     bool focusNextPrevChild(bool next) override;
188     QValidator::State validate(QString &input, int &pos) const override;
189     void fixup(QString &input) const override;
190 
191     virtual QDateTime dateTimeFromText(const QString &text) const;
192     virtual QString textFromDateTime(const QDateTime &dt) const;
193     StepEnabled stepEnabled() const override;
194     void mousePressEvent(QMouseEvent *event) override;
195     void paintEvent(QPaintEvent *event) override;
196     void initStyleOption(QStyleOptionSpinBox *option) const;
197 
198 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
199     QDateTimeEdit(const QVariant &val, QVariant::Type parserType, QWidget *parent = nullptr);
200 #endif
201     QDateTimeEdit(const QVariant &val, QMetaType::Type parserType, QWidget *parent = nullptr);
202 private:
203     Q_DECLARE_PRIVATE(QDateTimeEdit)
204     Q_DISABLE_COPY(QDateTimeEdit)
205 
206     Q_PRIVATE_SLOT(d_func(), void _q_resetButton())
207 };
208 
209 class Q_WIDGETS_EXPORT QTimeEdit : public QDateTimeEdit
210 {
211     Q_OBJECT
212     Q_PROPERTY(QTime time READ time WRITE setTime NOTIFY userTimeChanged USER true)
213 public:
214     explicit QTimeEdit(QWidget *parent = nullptr);
215     explicit QTimeEdit(const QTime &time, QWidget *parent = nullptr);
216     ~QTimeEdit();
217 
218 Q_SIGNALS:
219     void userTimeChanged(const QTime &time);
220 };
221 
222 class Q_WIDGETS_EXPORT QDateEdit : public QDateTimeEdit
223 {
224     Q_OBJECT
225     Q_PROPERTY(QDate date READ date WRITE setDate NOTIFY userDateChanged USER true)
226 public:
227     explicit QDateEdit(QWidget *parent = nullptr);
228     explicit QDateEdit(const QDate &date, QWidget *parent = nullptr);
229     ~QDateEdit();
230 
231 Q_SIGNALS:
232     void userDateChanged(const QDate &date);
233 };
234 
235 Q_DECLARE_OPERATORS_FOR_FLAGS(QDateTimeEdit::Sections)
236 
237 QT_END_NAMESPACE
238 
239 #endif // QDATETIMEEDIT_H
240