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