QGIS API Documentation 3.99.0-Master (2fe06baccd8)
Loading...
Searching...
No Matches
qgsdatetimeeditwrapper.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsdatetimeeditwrapper.cpp
3 --------------------------------------
4 Date : 03.2014
5 Copyright : (C) 2014 Denis Rouzaud
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
18#include "qgsapplication.h"
19#include "qgsdatetimeedit.h"
23#include "qgslogger.h"
24#include "qgsmessagelog.h"
25
26#include <QCalendarWidget>
27#include <QDateEdit>
28#include <QDateTimeEdit>
29#include <QTextCharFormat>
30#include <QTimeEdit>
31
32#include "moc_qgsdatetimeeditwrapper.cpp"
33
35 : QgsEditorWidgetWrapper( layer, fieldIdx, editor, parent )
36
37{
38}
39
40QWidget *QgsDateTimeEditWrapper::createWidget( QWidget *parent )
41{
42 QgsDateTimeEdit *widget = new QgsDateTimeEdit( parent );
43 widget->setDateTime( QDateTime::currentDateTime() );
44 return widget;
45}
46
48{
49 QgsDateTimeEdit *qgsEditor = dynamic_cast<QgsDateTimeEdit *>( editor );
50 if ( qgsEditor )
51 {
52 mQgsDateTimeEdit = qgsEditor;
53 }
54 // assign the Qt editor also if the QGIS editor has been previously assigned
55 // this avoids testing each time which widget to use
56 // the QGIS editor must be used for non-virtual methods (dateTime, setDateTime)
57 QDateTimeEdit *qtEditor = dynamic_cast<QDateTimeEdit *>( editor );
58 if ( qtEditor )
59 {
60 mQDateTimeEdit = qtEditor;
61 }
62
63 if ( !mQDateTimeEdit )
64 {
65 QgsDebugError( QStringLiteral( "Date/time edit widget could not be initialized because provided widget is not a QDateTimeEdit." ) );
66 QgsMessageLog::logMessage( tr( "Date/time edit widget could not be initialized because provided widget is not a QDateTimeEdit." ), tr( "UI forms" ), Qgis::MessageLevel::Warning );
67 return;
68 }
69
70 const QString displayFormat = config( QStringLiteral( "display_format" ), QgsDateTimeFieldFormatter::defaultFormat( field().type() ) ).toString();
71 mQDateTimeEdit->setDisplayFormat( displayFormat );
72
73 const bool calendar = config( QStringLiteral( "calendar_popup" ), true ).toBool();
74 if ( calendar != mQDateTimeEdit->calendarPopup() )
75 {
76 mQDateTimeEdit->setCalendarPopup( calendar );
77 }
78 if ( calendar && mQDateTimeEdit->calendarWidget() )
79 {
80 // highlight today's date
81 QTextCharFormat todayFormat;
82 todayFormat.setBackground( QColor( 160, 180, 200 ) );
83 mQDateTimeEdit->calendarWidget()->setDateTextFormat( QDate::currentDate(), todayFormat );
84 }
85
86 const bool allowNull = config( QStringLiteral( "allow_null" ), true ).toBool();
87 if ( mQgsDateTimeEdit )
88 {
89 mQgsDateTimeEdit->setAllowNull( allowNull );
90 }
91 else
92 {
93 QgsMessageLog::logMessage( tr( "The usual date/time widget QDateTimeEdit cannot be configured to allow NULL values. "
94 "For that the QGIS custom widget QgsDateTimeEdit needs to be used." ),
95 tr( "field widgets" ) );
96 }
97
98 if ( mQgsDateTimeEdit )
99 {
100 connect( mQgsDateTimeEdit, &QgsDateTimeEdit::valueChanged, this, &QgsDateTimeEditWrapper::dateTimeChanged );
101 }
102 else
103 {
104 connect( mQDateTimeEdit, &QDateTimeEdit::dateTimeChanged, this, &QgsDateTimeEditWrapper::dateTimeChanged );
105 }
106}
107
109{
110 return mQgsDateTimeEdit || mQDateTimeEdit;
111}
112
114{
115 if ( mQgsDateTimeEdit )
116 mQgsDateTimeEdit->setEmpty();
117}
118
119void QgsDateTimeEditWrapper::dateTimeChanged( const QDateTime &dateTime )
120{
121 switch ( field().type() )
122 {
123 case QMetaType::Type::QDateTime:
125 emit valueChanged( dateTime );
127 emit valuesChanged( dateTime );
128 break;
129 case QMetaType::Type::QDate:
131 emit valueChanged( dateTime.date() );
133 emit valuesChanged( dateTime.date() );
134 break;
135 case QMetaType::Type::QTime:
137 emit valueChanged( dateTime.time() );
139 emit valuesChanged( dateTime.time() );
140 break;
141 default:
142 if ( !dateTime.isValid() || dateTime.isNull() )
143 {
148 }
149 else
150 {
151 const bool fieldIsoFormat = config( QStringLiteral( "field_iso_format" ), false ).toBool();
152 const QString fieldFormat = config( QStringLiteral( "field_format" ), QgsDateTimeFieldFormatter::defaultFormat( field().type() ) ).toString();
153 if ( fieldIsoFormat )
154 {
156 emit valueChanged( dateTime.toString( Qt::ISODate ) );
158 emit valuesChanged( dateTime.toString( Qt::ISODate ) );
159 }
160 else
161 {
163 emit valueChanged( dateTime.toString( fieldFormat ) );
165 emit valuesChanged( dateTime.toString( fieldFormat ) );
166 }
167 }
168 break;
169 }
170}
171
173{
174 if ( !mQDateTimeEdit )
175 return QgsVariantUtils::createNullVariant( field().type() );
176
177 QDateTime dateTime;
178 if ( mQgsDateTimeEdit )
179 {
180 dateTime = mQgsDateTimeEdit->dateTime();
181 }
182 else
183 {
184 dateTime = mQDateTimeEdit->dateTime();
185 }
186
187 if ( dateTime.isNull() )
188 return QgsVariantUtils::createNullVariant( field().type() );
189
190 switch ( field().type() )
191 {
192 case QMetaType::Type::QDateTime:
193 return dateTime;
194 case QMetaType::Type::QDate:
195 return dateTime.date();
196 case QMetaType::Type::QTime:
197 return dateTime.time();
198 default:
199 const bool fieldIsoFormat = config( QStringLiteral( "field_iso_format" ), false ).toBool();
200 const QString fieldFormat = config( QStringLiteral( "field_format" ), QgsDateTimeFieldFormatter::defaultFormat( field().type() ) ).toString();
201 if ( fieldIsoFormat )
202 {
203 return dateTime.toString( Qt::ISODate );
204 }
205 else
206 {
207 return dateTime.toString( fieldFormat );
208 }
209 }
210#ifndef _MSC_VER // avoid warnings
211 return QVariant(); // avoid warnings
212#endif
213}
214
215void QgsDateTimeEditWrapper::updateValues( const QVariant &value, const QVariantList & )
216{
217 if ( !mQDateTimeEdit )
218 return;
219
220 QDateTime dateTime;
221
222 switch ( field().type() )
223 {
224 case QMetaType::Type::QDateTime:
225 dateTime = value.toDateTime();
226 break;
227 case QMetaType::Type::QDate:
228 dateTime.setDate( value.toDate() );
229 dateTime.setTime( QTime( 0, 0, 0 ) );
230 break;
231 case QMetaType::Type::QTime:
232 dateTime.setDate( QDate::currentDate() );
233 dateTime.setTime( value.toTime() );
234 break;
235 default:
236 // Field type is not a date/time but we might already have a date/time variant
237 // value coming from a default: no need for string parsing in that case
238 switch ( value.userType() )
239 {
240 case QMetaType::Type::QDateTime:
241 {
242 dateTime = value.toDateTime();
243 break;
244 }
245 case QMetaType::Type::QDate:
246 {
247 dateTime.setDate( value.toDate() );
248 dateTime.setTime( QTime( 0, 0, 0 ) );
249 break;
250 }
251 case QMetaType::Type::QTime:
252 {
253 dateTime.setDate( QDate::currentDate() );
254 dateTime.setTime( value.toTime() );
255 break;
256 }
257 default:
258 {
259 const bool fieldIsoFormat = config( QStringLiteral( "field_iso_format" ), false ).toBool();
260 const QString fieldFormat = config( QStringLiteral( "field_format" ), QgsDateTimeFieldFormatter::defaultFormat( field().type() ) ).toString();
261 if ( fieldIsoFormat )
262 {
263 dateTime = QDateTime::fromString( value.toString(), Qt::ISODate );
264 }
265 else
266 {
267 dateTime = QDateTime::fromString( value.toString(), fieldFormat );
268 }
269 break;
270 }
271 }
272 break;
273 }
274
275 if ( mQgsDateTimeEdit )
276 {
277 // Convert to UTC if the format string includes a Z
278 if ( mQgsDateTimeEdit->displayFormat().indexOf( "Z" ) > 0 )
279 {
280 dateTime = dateTime.toUTC();
281 }
282
283 mQgsDateTimeEdit->setDateTime( dateTime );
284 }
285 else
286 {
287 mQDateTimeEdit->setDateTime( dateTime );
288 }
289}
290
292{
293 if ( !mQDateTimeEdit )
294 return;
295
296 mQDateTimeEdit->setReadOnly( !enabled );
297 mQDateTimeEdit->setFrame( enabled );
298}
@ Warning
Warning message.
Definition qgis.h:158
bool valid() const override
Returns true if the widget has been properly initialized.
void initWidget(QWidget *editor) override
This method should initialize the editor widget with runtime data.
QgsDateTimeEditWrapper(QgsVectorLayer *layer, int fieldIdx, QWidget *editor, QWidget *parent=nullptr)
Constructor for QgsDateTimeEditWrapper.
QVariant value() const override
Will be used to access the widget's value.
void showIndeterminateState() override
Sets the widget to display in an indeterminate "mixed value" state.
void setEnabled(bool enabled) override
QWidget * createWidget(QWidget *parent) override
This method should create a new widget with the provided parent.
A QDateTimeEdit with the capability of setting/reading null date/times.
void setEmpty()
Resets the widget to show no value (ie, an "unknown" state).
void valueChanged(const QDateTime &date)
Signal emitted whenever the value changes.
static QString defaultFormat(QMetaType::Type type)
Gets the default format in function of the type.
Q_DECL_DEPRECATED void valueChanged(const QVariant &value)
Emit this signal, whenever the value changed.
int fieldIdx() const
Access the field index.
QgsEditorWidgetWrapper(QgsVectorLayer *vl, int fieldIdx, QWidget *editor=nullptr, QWidget *parent=nullptr)
Create a new widget wrapper.
void valuesChanged(const QVariant &value, const QVariantList &additionalFieldValues=QVariantList())
Emit this signal, whenever the value changed.
QgsField field() const
Access the field.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE())
Adds a message to the log instance (and creates it if necessary).
static QVariant createNullVariant(QMetaType::Type metaType)
Helper method to properly create a null QVariant from a metaType Returns the created QVariant.
Represents a vector layer which manages a vector based dataset.
QWidget * widget()
Access the widget managed by this wrapper.
QgsVectorLayer * layer() const
Returns the vector layer associated with the widget.
QVariantMap config() const
Returns the whole config.
#define Q_NOWARN_DEPRECATED_POP
Definition qgis.h:7170
#define Q_NOWARN_DEPRECATED_PUSH
Definition qgis.h:7169
#define QgsDebugError(str)
Definition qgslogger.h:57