diff options
Diffstat (limited to 'src/widgets/widgets/qdatetimeedit.cpp')
-rw-r--r-- | src/widgets/widgets/qdatetimeedit.cpp | 98 |
1 files changed, 48 insertions, 50 deletions
diff --git a/src/widgets/widgets/qdatetimeedit.cpp b/src/widgets/widgets/qdatetimeedit.cpp index c52bb89f28..105318ba20 100644 --- a/src/widgets/widgets/qdatetimeedit.cpp +++ b/src/widgets/widgets/qdatetimeedit.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2019 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtWidgets module of the Qt Toolkit. @@ -53,6 +53,9 @@ #include <qlayout.h> #include <qset.h> #include <qstyle.h> +#if QT_CONFIG(timezone) +#include <QTimeZone> +#endif #include <algorithm> @@ -130,14 +133,14 @@ QT_BEGIN_NAMESPACE */ /*! - \fn void QDateTimeEdit::timeChanged(const QTime &time) + \fn void QDateTimeEdit::timeChanged(QTime time) This signal is emitted whenever the time is changed. The new time is passed in \a time. */ /*! - \fn void QDateTimeEdit::dateChanged(const QDate &date) + \fn void QDateTimeEdit::dateChanged(QDate date) This signal is emitted whenever the date is changed. The new date is passed in \a date. @@ -168,13 +171,13 @@ QDateTimeEdit::QDateTimeEdit(const QDateTime &datetime, QWidget *parent) } /*! - \fn QDateTimeEdit::QDateTimeEdit(const QDate &date, QWidget *parent) + \fn QDateTimeEdit::QDateTimeEdit(QDate date, QWidget *parent) Constructs an empty date time editor with a \a parent. The value is set to \a date. */ -QDateTimeEdit::QDateTimeEdit(const QDate &date, QWidget *parent) +QDateTimeEdit::QDateTimeEdit(QDate date, QWidget *parent) : QAbstractSpinBox(*new QDateTimeEditPrivate, parent) { Q_D(QDateTimeEdit); @@ -182,13 +185,13 @@ QDateTimeEdit::QDateTimeEdit(const QDate &date, QWidget *parent) } /*! - \fn QDateTimeEdit::QDateTimeEdit(const QTime &time, QWidget *parent) + \fn QDateTimeEdit::QDateTimeEdit(QTime time, QWidget *parent) Constructs an empty date time editor with a \a parent. The value is set to \a time. */ -QDateTimeEdit::QDateTimeEdit(const QTime &time, QWidget *parent) +QDateTimeEdit::QDateTimeEdit(QTime time, QWidget *parent) : QAbstractSpinBox(*new QDateTimeEditPrivate, parent) { Q_D(QDateTimeEdit); @@ -226,8 +229,8 @@ QDateTimeEdit::~QDateTimeEdit() \property QDateTimeEdit::dateTime \brief The QDateTime that is set in the QDateTimeEdit. - When setting this property the timespec of the QDateTimeEdit remains the same - and the timespec of the new QDateTime is ignored. + When setting this property, the new QDateTime is converted to the timespec of + the QDateTimeEdit, which thus remains unchanged. By default, this property is set to the start of 2000 CE. It can only be set to a valid QDateTime value. If any operation causes this property to have an @@ -251,11 +254,14 @@ void QDateTimeEdit::setDateTime(const QDateTime &datetime) { Q_D(QDateTimeEdit); if (datetime.isValid()) { + QDateTime when = d->convertTimeSpec(datetime); + Q_ASSERT(when.timeSpec() == d->spec); + d->clearCache(); - const QDate date = datetime.date(); + const QDate date = when.date(); if (!(d->sections & DateSections_Mask)) setDateRange(date, date); - d->setValue(QDateTime(date, datetime.time(), d->spec), EmitIfChanged); + d->setValue(when, EmitIfChanged); } } @@ -277,7 +283,7 @@ QDate QDateTimeEdit::date() const return d->value.toDate(); } -void QDateTimeEdit::setDate(const QDate &date) +void QDateTimeEdit::setDate(QDate date) { Q_D(QDateTimeEdit); if (date.isValid()) { @@ -314,7 +320,7 @@ QTime QDateTimeEdit::time() const return d->value.toTime(); } -void QDateTimeEdit::setTime(const QTime &time) +void QDateTimeEdit::setTime(QTime time) { Q_D(QDateTimeEdit); if (time.isValid()) { @@ -477,7 +483,7 @@ QDate QDateTimeEdit::minimumDate() const return d->minimum.toDate(); } -void QDateTimeEdit::setMinimumDate(const QDate &min) +void QDateTimeEdit::setMinimumDate(QDate min) { Q_D(QDateTimeEdit); if (min.isValid() && min >= QDATETIMEEDIT_DATE_MIN) { @@ -517,7 +523,7 @@ QDate QDateTimeEdit::maximumDate() const return d->maximum.toDate(); } -void QDateTimeEdit::setMaximumDate(const QDate &max) +void QDateTimeEdit::setMaximumDate(QDate max) { Q_D(QDateTimeEdit); if (max.isValid()) @@ -554,7 +560,7 @@ QTime QDateTimeEdit::minimumTime() const return d->minimum.toTime(); } -void QDateTimeEdit::setMinimumTime(const QTime &min) +void QDateTimeEdit::setMinimumTime(QTime min) { Q_D(QDateTimeEdit); if (min.isValid()) { @@ -592,7 +598,7 @@ QTime QDateTimeEdit::maximumTime() const return d->maximum.toTime(); } -void QDateTimeEdit::setMaximumTime(const QTime &max) +void QDateTimeEdit::setMaximumTime(QTime max) { Q_D(QDateTimeEdit); if (max.isValid()) { @@ -628,7 +634,7 @@ void QDateTimeEdit::clearMaximumTime() \sa minimumDate, maximumDate, setDateTimeRange(), QDate::isValid() */ -void QDateTimeEdit::setDateRange(const QDate &min, const QDate &max) +void QDateTimeEdit::setDateRange(QDate min, QDate max) { Q_D(QDateTimeEdit); if (min.isValid() && max.isValid()) { @@ -662,7 +668,7 @@ void QDateTimeEdit::setDateRange(const QDate &min, const QDate &max) \sa minimumTime, maximumTime, setDateTimeRange(), QTime::isValid() */ -void QDateTimeEdit::setTimeRange(const QTime &min, const QTime &max) +void QDateTimeEdit::setTimeRange(QTime min, QTime max) { Q_D(QDateTimeEdit); if (min.isValid() && max.isValid()) { @@ -1592,7 +1598,7 @@ QTimeEdit::QTimeEdit(QWidget *parent) to \a time. */ -QTimeEdit::QTimeEdit(const QTime &time, QWidget *parent) +QTimeEdit::QTimeEdit(QTime time, QWidget *parent) : QDateTimeEdit(time, QMetaType::QTime, parent) { connect(this, &QTimeEdit::timeChanged, this, &QTimeEdit::userTimeChanged); @@ -1612,7 +1618,7 @@ QTimeEdit::~QTimeEdit() */ /*! - \fn void QTimeEdit::userTimeChanged(const QTime &time) + \fn void QTimeEdit::userTimeChanged(QTime time) This signal only exists to fully implement the time Q_PROPERTY on the class. Normally timeChanged should be used instead. @@ -1662,7 +1668,7 @@ QDateEdit::QDateEdit(QWidget *parent) to \a date. */ -QDateEdit::QDateEdit(const QDate &date, QWidget *parent) +QDateEdit::QDateEdit(QDate date, QWidget *parent) : QDateTimeEdit(date, QMetaType::QDate, parent) { connect(this, &QDateEdit::dateChanged, this, &QDateEdit::userDateChanged); @@ -1682,7 +1688,7 @@ QDateEdit::~QDateEdit() */ /*! - \fn void QDateEdit::userDateChanged(const QDate &date) + \fn void QDateEdit::userDateChanged(QDate date) This signal only exists to fully implement the date Q_PROPERTY on the class. Normally dateChanged should be used instead. @@ -1724,6 +1730,25 @@ QDateTimeEditPrivate::QDateTimeEditPrivate() #endif } +QDateTime QDateTimeEditPrivate::convertTimeSpec(const QDateTime &datetime) +{ + Q_ASSERT(value.toDateTime().timeSpec() == spec); + switch (spec) { + case Qt::UTC: + return datetime.toUTC(); + case Qt::LocalTime: + return datetime.toLocalTime(); + case Qt::OffsetFromUTC: + return datetime.toOffsetFromUtc(value.toDateTime().offsetFromUtc()); +#if QT_CONFIG(timezone) + case Qt::TimeZone: + return datetime.toTimeZone(value.toDateTime().timeZone()); +#endif + } + Q_UNREACHABLE(); +} + +// FIXME: architecturaly incompatible with OffsetFromUTC or TimeZone as spec (QTBUG-80417). void QDateTimeEditPrivate::updateTimeSpec() { minimum = minimum.toDateTime().toTimeSpec(spec); @@ -2366,33 +2391,6 @@ void QDateTimeEdit::paintEvent(QPaintEvent *event) style()->drawComplexControl(QStyle::CC_ComboBox, &optCombo, &p, this); } -/* - Returns the string for AM and PM markers. - - If a translation for "AM" and "PM" is installed, then use that. - Otherwise, use the default implementation, which uses the locale. -*/ -QString QDateTimeEditPrivate::getAmPmText(AmPm ap, Case cs) const -{ - QString original; - QString translated; - if (ap == AmText) { - original = QLatin1String(cs == UpperCase ? "AM" : "am"); - translated = (cs == UpperCase ? QDateTimeParser::tr("AM") : QDateTimeParser::tr("am")); - } else { - original = QLatin1String(cs == UpperCase ? "PM" : "pm"); - translated = (cs == UpperCase ? QDateTimeParser::tr("PM") : QDateTimeParser::tr("pm")); - } - - // This logic fails if a translation exists but doesn't change the string, - // which we can accept as a corner-case for which a locale-derived answer - // will be acceptable. - if (original != translated) - return translated; - - return QDateTimeParser::getAmPmText(ap, cs); -} - int QDateTimeEditPrivate::absoluteIndex(QDateTimeEdit::Section s, int index) const { for (int i=0; i<sectionNodes.size(); ++i) { |