QGIS API Documentation 4.1.0-Master (5bf3c20f3c9)
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 <QString>
30#include <QTextCharFormat>
31#include <QTimeEdit>
32
33#include "moc_qgsdatetimeeditwrapper.cpp"
34
35using namespace Qt::StringLiterals;
36
38 : QgsEditorWidgetWrapper( layer, fieldIdx, editor, parent )
39
40{}
41
42QWidget *QgsDateTimeEditWrapper::createWidget( QWidget *parent )
43{
44 QgsDateTimeEdit *widget = new QgsDateTimeEdit( parent );
45 widget->setDateTime( QDateTime::currentDateTime() );
46 return widget;
47}
48
50{
51 QgsDateTimeEdit *qgsEditor = dynamic_cast<QgsDateTimeEdit *>( editor );
52 if ( qgsEditor )
53 {
54 mQgsDateTimeEdit = qgsEditor;
55 }
56 // assign the Qt editor also if the QGIS editor has been previously assigned
57 // this avoids testing each time which widget to use
58 // the QGIS editor must be used for non-virtual methods (dateTime, setDateTime)
59 QDateTimeEdit *qtEditor = dynamic_cast<QDateTimeEdit *>( editor );
60 if ( qtEditor )
61 {
62 mQDateTimeEdit = qtEditor;
63 }
64
65 if ( !mQDateTimeEdit )
66 {
67 QgsDebugError( u"Date/time edit widget could not be initialized because provided widget is not a QDateTimeEdit."_s );
68 QgsMessageLog::logMessage( tr( "Date/time edit widget could not be initialized because provided widget is not a QDateTimeEdit." ), tr( "UI forms" ), Qgis::MessageLevel::Warning );
69 return;
70 }
71
72 const QString displayFormat = config( u"display_format"_s, QgsDateTimeFieldFormatter::defaultFormat( field().type() ) ).toString();
73 mQDateTimeEdit->setDisplayFormat( displayFormat );
74
75 const bool calendar = config( u"calendar_popup"_s, true ).toBool();
76 if ( calendar != mQDateTimeEdit->calendarPopup() )
77 {
78 mQDateTimeEdit->setCalendarPopup( calendar );
79 }
80 if ( calendar && mQDateTimeEdit->calendarWidget() )
81 {
82 // highlight today's date
83 QTextCharFormat todayFormat;
84 todayFormat.setBackground( QColor( 160, 180, 200 ) );
85 mQDateTimeEdit->calendarWidget()->setDateTextFormat( QDate::currentDate(), todayFormat );
86 }
87
88 const bool allowNull = config( u"allow_null"_s, true ).toBool();
89 if ( mQgsDateTimeEdit )
90 {
91 mQgsDateTimeEdit->setAllowNull( allowNull );
92 }
93 else
94 {
96 tr(
97 "The usual date/time widget QDateTimeEdit cannot be configured to allow NULL values. "
98 "For that the QGIS custom widget QgsDateTimeEdit needs to be used."
99 ),
100 tr( "field widgets" )
101 );
102 }
103
104 if ( mQgsDateTimeEdit )
105 {
106 connect( mQgsDateTimeEdit, &QgsDateTimeEdit::valueChanged, this, &QgsDateTimeEditWrapper::dateTimeChanged );
107 }
108 else
109 {
110 connect( mQDateTimeEdit, &QDateTimeEdit::dateTimeChanged, this, &QgsDateTimeEditWrapper::dateTimeChanged );
111 }
112}
113
115{
116 return mQgsDateTimeEdit || mQDateTimeEdit;
117}
118
120{
121 if ( mQgsDateTimeEdit )
122 mQgsDateTimeEdit->setEmpty();
123}
124
125void QgsDateTimeEditWrapper::dateTimeChanged( const QDateTime &dateTime )
126{
127 switch ( field().type() )
128 {
129 case QMetaType::Type::QDateTime:
131 emit valueChanged( dateTime );
133 emit valuesChanged( dateTime );
134 break;
135 case QMetaType::Type::QDate:
137 emit valueChanged( dateTime.date() );
139 emit valuesChanged( dateTime.date() );
140 break;
141 case QMetaType::Type::QTime:
143 emit valueChanged( dateTime.time() );
145 emit valuesChanged( dateTime.time() );
146 break;
147 default:
148 if ( !dateTime.isValid() || dateTime.isNull() )
149 {
154 }
155 else
156 {
157 const bool fieldIsoFormat = config( u"field_iso_format"_s, false ).toBool();
158 const QString fieldFormat = config( u"field_format"_s, QgsDateTimeFieldFormatter::defaultFormat( field().type() ) ).toString();
159 if ( fieldIsoFormat )
160 {
162 emit valueChanged( dateTime.toString( Qt::ISODate ) );
164 emit valuesChanged( dateTime.toString( Qt::ISODate ) );
165 }
166 else
167 {
169 emit valueChanged( dateTime.toString( fieldFormat ) );
171 emit valuesChanged( dateTime.toString( fieldFormat ) );
172 }
173 }
174 break;
175 }
176}
177
179{
180 if ( !mQDateTimeEdit )
181 return QgsVariantUtils::createNullVariant( field().type() );
182
183 QDateTime dateTime;
184 if ( mQgsDateTimeEdit )
185 {
186 dateTime = mQgsDateTimeEdit->dateTime();
187 }
188 else
189 {
190 dateTime = mQDateTimeEdit->dateTime();
191 }
192
193 if ( dateTime.isNull() )
194 return QgsVariantUtils::createNullVariant( field().type() );
195
196 switch ( field().type() )
197 {
198 case QMetaType::Type::QDateTime:
199 return dateTime;
200 case QMetaType::Type::QDate:
201 return dateTime.date();
202 case QMetaType::Type::QTime:
203 return dateTime.time();
204 default:
205 const bool fieldIsoFormat = config( u"field_iso_format"_s, false ).toBool();
206 const QString fieldFormat = config( u"field_format"_s, QgsDateTimeFieldFormatter::defaultFormat( field().type() ) ).toString();
207 if ( fieldIsoFormat )
208 {
209 return dateTime.toString( Qt::ISODate );
210 }
211 else
212 {
213 return dateTime.toString( fieldFormat );
214 }
215 }
216#ifndef _MSC_VER // avoid warnings
217 return QVariant(); // avoid warnings
218#endif
219}
220
221void QgsDateTimeEditWrapper::updateValues( const QVariant &value, const QVariantList & )
222{
223 if ( !mQDateTimeEdit )
224 return;
225
226 QDateTime dateTime;
227
228 switch ( field().type() )
229 {
230 case QMetaType::Type::QDateTime:
231 dateTime = value.toDateTime();
232 break;
233 case QMetaType::Type::QDate:
234 dateTime.setDate( value.toDate() );
235 dateTime.setTime( QTime( 0, 0, 0 ) );
236 break;
237 case QMetaType::Type::QTime:
238 dateTime.setDate( QDate::currentDate() );
239 dateTime.setTime( value.toTime() );
240 break;
241 default:
242 // Field type is not a date/time but we might already have a date/time variant
243 // value coming from a default: no need for string parsing in that case
244 switch ( value.userType() )
245 {
246 case QMetaType::Type::QDateTime:
247 {
248 dateTime = value.toDateTime();
249 break;
250 }
251 case QMetaType::Type::QDate:
252 {
253 dateTime.setDate( value.toDate() );
254 dateTime.setTime( QTime( 0, 0, 0 ) );
255 break;
256 }
257 case QMetaType::Type::QTime:
258 {
259 dateTime.setDate( QDate::currentDate() );
260 dateTime.setTime( value.toTime() );
261 break;
262 }
263 default:
264 {
265 const bool fieldIsoFormat = config( u"field_iso_format"_s, false ).toBool();
266 const QString fieldFormat = config( u"field_format"_s, QgsDateTimeFieldFormatter::defaultFormat( field().type() ) ).toString();
267 if ( fieldIsoFormat )
268 {
269 dateTime = QDateTime::fromString( value.toString(), Qt::ISODate );
270 }
271 else
272 {
273 dateTime = QDateTime::fromString( value.toString(), fieldFormat );
274 }
275 break;
276 }
277 }
278 break;
279 }
280
281 if ( mQgsDateTimeEdit )
282 {
283 // Convert to UTC if the format string includes a Z
284 if ( mQgsDateTimeEdit->displayFormat().indexOf( "Z" ) > 0 )
285 {
286 dateTime = dateTime.toUTC();
287 }
288
289 mQgsDateTimeEdit->setDateTime( dateTime );
290 }
291 else
292 {
293 mQDateTimeEdit->setDateTime( dateTime );
294 }
295}
296
298{
299 if ( !mQDateTimeEdit )
300 return;
301
302 mQDateTimeEdit->setReadOnly( !enabled );
303 mQDateTimeEdit->setFrame( enabled );
304}
@ Warning
Warning message.
Definition qgis.h:162
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(), Qgis::StringFormat format=Qgis::StringFormat::PlainText)
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:7504
#define Q_NOWARN_DEPRECATED_PUSH
Definition qgis.h:7503
#define QgsDebugError(str)
Definition qgslogger.h:59