17 #include <QCalendarWidget> 19 #include <QMouseEvent> 21 #include <QStyleOptionSpinBox> 32 : QDateTimeEdit( parent )
35 mClearAction =
new QAction( clearIcon, tr(
"clear" ),
this );
36 mClearAction->setCheckable(
false );
37 lineEdit()->addAction( mClearAction, QLineEdit::TrailingPosition );
38 mClearAction->setVisible( mAllowNull );
41 connect(
this, &QDateTimeEdit::dateTimeChanged,
this, &QgsDateTimeEdit::changed );
44 setCalendarPopup(
true );
46 setMinimumEditDateTime();
49 QDateTimeEdit::setDateTime( QDateTime::currentDateTime() );
55 mClearAction->setVisible( mAllowNull && ( !mIsNull || mIsEmpty ) );
68 changed( QDateTime() );
76 disconnect(
this, &QDateTimeEdit::dateTimeChanged,
this, &QgsDateTimeEdit::changed );
77 emit dateTimeChanged( QDateTime() );
78 connect(
this, &QDateTimeEdit::dateTimeChanged,
this, &QgsDateTimeEdit::changed );
84 mClearAction->setVisible( mAllowNull );
94 bool updateCalendar =
false;
98 QStyle::SubControl control;
99 if ( calendarPopup() )
101 QStyleOptionComboBox optCombo;
102 optCombo.init(
this );
103 optCombo.editable =
true;
104 optCombo.subControls = QStyle::SC_All;
105 control = style()->hitTestComplexControl( QStyle::CC_ComboBox, &optCombo, event->pos(), this );
107 if ( control == QStyle::SC_ComboBoxArrow && calendarWidget() )
109 mCurrentPressEvent =
true;
111 updateCalendar =
true;
112 displayNull( updateCalendar );
113 mCurrentPressEvent =
false;
118 QStyleOptionSpinBox opt;
119 this->initStyleOption( &opt );
120 control = style()->hitTestComplexControl( QStyle::CC_SpinBox, &opt, event->pos(), this );
122 if ( control == QStyle::SC_SpinBoxDown || control == QStyle::SC_SpinBoxUp )
124 mCurrentPressEvent =
true;
125 disconnect(
this, &QDateTimeEdit::dateTimeChanged,
this, &QgsDateTimeEdit::changed );
126 resetBeforeChange( control == QStyle::SC_SpinBoxDown ? -1 : 1 );
127 connect(
this, &QDateTimeEdit::dateTimeChanged,
this, &QgsDateTimeEdit::changed );
128 mCurrentPressEvent =
false;
133 QDateTimeEdit::mousePressEvent( event );
135 if ( updateCalendar )
138 calendarWidget()->setCurrentPage( QDate::currentDate().year(), QDate::currentDate().month() );
144 if ( mAllowNull && mIsNull && !mCurrentPressEvent )
146 QAbstractSpinBox::focusOutEvent( event );
151 emit editingFinished();
155 QDateTimeEdit::focusOutEvent( event );
161 if ( mAllowNull && mIsNull && !mCurrentPressEvent )
163 QAbstractSpinBox::focusInEvent( event );
165 displayCurrentDate();
169 QDateTimeEdit::focusInEvent( event );
176 if ( mAllowNull && mIsNull )
178 resetBeforeChange( -event->delta() );
180 QDateTimeEdit::wheelEvent( event );
185 QDateTimeEdit::showEvent( event );
186 if ( mAllowNull && mIsNull &&
193 void QgsDateTimeEdit::changed(
const QDateTime &
dateTime )
196 bool isNull = dateTime.isNull();
197 if ( isNull != mIsNull )
202 if ( mOriginalStyleSheet.isNull() )
204 mOriginalStyleSheet = lineEdit()->styleSheet();
206 lineEdit()->setStyleSheet( QStringLiteral(
"QLineEdit { font-style: italic; color: grey; }" ) );
210 lineEdit()->setStyleSheet( mOriginalStyleSheet );
214 mClearAction->setVisible( mAllowNull && !mIsNull );
219 void QgsDateTimeEdit::displayNull(
bool updateCalendar )
221 disconnect(
this, &QDateTimeEdit::dateTimeChanged,
this, &QgsDateTimeEdit::changed );
222 if ( updateCalendar )
226 QDateTimeEdit::setDateTime( minimumDateTime() );
228 lineEdit()->setCursorPosition( lineEdit()->text().length() );
230 connect(
this, &QDateTimeEdit::dateTimeChanged,
this, &QgsDateTimeEdit::changed );
233 void QgsDateTimeEdit::displayCurrentDate()
235 disconnect(
this, &QDateTimeEdit::dateTimeChanged,
this, &QgsDateTimeEdit::changed );
236 QDateTimeEdit::setDateTime( QDateTime::currentDateTime() );
237 connect(
this, &QDateTimeEdit::dateTimeChanged,
this, &QgsDateTimeEdit::changed );
240 void QgsDateTimeEdit::resetBeforeChange(
int delta )
242 QDateTime dt = QDateTime::currentDateTime();
243 switch ( currentSection() )
245 case QDateTimeEdit::DaySection:
246 dt = dt.addDays( delta );
248 case QDateTimeEdit::MonthSection:
249 dt = dt.addMonths( delta );
251 case QDateTimeEdit::YearSection:
252 dt = dt.addYears( delta );
257 if ( dt < minimumDateTime() )
259 dt = minimumDateTime();
261 else if ( dt > maximumDateTime() )
263 dt = maximumDateTime();
265 QDateTimeEdit::setDateTime( dt );
273 if ( !dateTime.isValid() || dateTime.isNull() )
281 QDateTimeEdit::setDateTime( dateTime );
288 if ( mAllowNull && mIsNull )
294 return QDateTimeEdit::dateTime();
300 if ( mAllowNull && mIsNull )
306 return QDateTimeEdit::time();
312 if ( mAllowNull && mIsNull )
318 return QDateTimeEdit::date();
QTime time() const
Returns the time which can be a null time.
bool allowNull() const
If the widget allows setting null date/time.
void showEvent(QShowEvent *event) override
static QIcon getThemeIcon(const QString &name)
Helper to get a theme icon.
void focusOutEvent(QFocusEvent *event) override
void wheelEvent(QWheelEvent *event) override
void focusInEvent(QFocusEvent *event) override
static QString nullRepresentation()
This string is used to represent the value NULL throughout QGIS.
void valueChanged(const QDateTime &date)
Signal emitted whenever the value changes.
void setEmpty()
Resets the widget to show no value (ie, an "unknown" state).
void setAllowNull(bool allowNull)
Determines if the widget allows setting null date/time.
QgsDateTimeEdit(QWidget *parent=nullptr)
Constructor for QgsDateTimeEdit.
void setDateTime(const QDateTime &dateTime)
Set the date time in the widget and handles null date times.
QDate date() const
Returns the date which can be a null date.
void clear() override
Set the current date as NULL.
QDateTime dateTime() const
Returns the date time which can be a null date/time.
void mousePressEvent(QMouseEvent *event) override