47 case QMetaType::Type::UnknownType:
49 case QMetaType::Type::Bool:
50 return QObject::tr(
"Boolean" );
51 case QMetaType::Type::Int:
52 return QObject::tr(
"Integer (32 bit)" );
53 case QMetaType::Type::UInt:
54 return QObject::tr(
"Integer (unsigned 32 bit)" );
55 case QMetaType::Type::LongLong:
56 return QObject::tr(
"Integer (64 bit)" );
57 case QMetaType::Type::ULongLong:
58 return QObject::tr(
"Integer (unsigned 64 bit)" );
59 case QMetaType::Type::Double:
60 return QObject::tr(
"Decimal (double)" );
61 case QMetaType::Type::QChar:
62 return QObject::tr(
"Character" );
63 case QMetaType::Type::QVariantMap:
64 return QObject::tr(
"Map" );
65 case QMetaType::Type::QVariantList:
69 case QMetaType::Type::Int:
70 return QObject::tr(
"Integer List" );
71 case QMetaType::Type::LongLong:
72 return QObject::tr(
"Integer (64 bit) List" );
73 case QMetaType::Type::Double:
74 return QObject::tr(
"Decimal (double) List" );
76 return QObject::tr(
"List" );
79 case QMetaType::Type::QString:
80 return QObject::tr(
"Text (string)" );
81 case QMetaType::Type::QStringList:
82 return QObject::tr(
"String List" );
83 case QMetaType::Type::QByteArray:
84 return QObject::tr(
"Binary Object (BLOB)" );
85 case QMetaType::Type::QBitArray:
86 return QObject::tr(
"Bit Array" );
87 case QMetaType::Type::QDate:
88 return QObject::tr(
"Date" );
89 case QMetaType::Type::QTime:
90 return QObject::tr(
"Time" );
91 case QMetaType::Type::QDateTime:
92 return QObject::tr(
"Date & Time" );
93 case QMetaType::Type::QUrl:
94 return QObject::tr(
"URL" );
95 case QMetaType::Type::QLocale:
96 return QObject::tr(
"Locale" );
97 case QMetaType::Type::QRect:
98 case QMetaType::Type::QRectF:
99 return QObject::tr(
"Rectangle" );
100 case QMetaType::Type::QSize:
101 case QMetaType::Type::QSizeF:
102 return QObject::tr(
"Size" );
103 case QMetaType::Type::QLine:
104 case QMetaType::Type::QLineF:
105 return QObject::tr(
"Line" );
106 case QMetaType::Type::QPoint:
107 case QMetaType::Type::QPointF:
108 return QObject::tr(
"Point" );
109 case QMetaType::Type::QRegularExpression:
110 return QObject::tr(
"Regular Expression" );
111 case QMetaType::Type::QVariantHash:
112 return QObject::tr(
"Hash" );
113 case QMetaType::Type::QEasingCurve:
114 return QObject::tr(
"Easing Curve" );
115 case QMetaType::Type::QUuid:
116 return QObject::tr(
"UUID" );
117 case QMetaType::Type::QModelIndex:
118 case QMetaType::Type::QPersistentModelIndex:
119 return QObject::tr(
"Model Index" );
120 case QMetaType::Type::QFont:
121 return QObject::tr(
"Font" );
122 case QMetaType::Type::QPixmap:
123 return QObject::tr(
"Pixmap" );
124 case QMetaType::Type::QBrush:
125 return QObject::tr(
"Brush" );
126 case QMetaType::Type::QColor:
127 return QObject::tr(
"Color" );
128 case QMetaType::Type::QPalette:
129 return QObject::tr(
"Palette" );
130 case QMetaType::Type::QImage:
131 return QObject::tr(
"Image" );
132 case QMetaType::Type::QPolygon:
133 case QMetaType::Type::QPolygonF:
134 return QObject::tr(
"Polygon" );
135 case QMetaType::Type::QRegion:
136 return QObject::tr(
"Region" );
137 case QMetaType::Type::QBitmap:
138 return QObject::tr(
"Bitmap" );
139 case QMetaType::Type::QCursor:
140 return QObject::tr(
"Cursor" );
141 case QMetaType::Type::QKeySequence:
142 return QObject::tr(
"Key Sequence" );
143 case QMetaType::Type::QPen:
144 return QObject::tr(
"Pen" );
145 case QMetaType::Type::QTextLength:
146 return QObject::tr(
"Text Length" );
147 case QMetaType::Type::QTextFormat:
148 return QObject::tr(
"Text Format" );
149 case QMetaType::Type::QMatrix4x4:
150 return QObject::tr(
"Matrix" );
151 case QMetaType::Type::QTransform:
152 return QObject::tr(
"Transform" );
153 case QMetaType::Type::QVector2D:
154 case QMetaType::Type::QVector3D:
155 case QMetaType::Type::QVector4D:
156 return QObject::tr(
"Vector" );
157 case QMetaType::Type::QQuaternion:
158 return QObject::tr(
"Quaternion" );
159 case QMetaType::Type::QIcon:
160 return QObject::tr(
"Icon" );
161 case QMetaType::Type::QSizePolicy:
162 return QObject::tr(
"Size Policy" );
178 ( void )silenceNullWarnings;
181 if ( variant.isNull() || !variant.isValid() )
184 switch ( variant.userType() )
186 case QMetaType::Type::UnknownType:
187 case QMetaType::Type::Bool:
188 case QMetaType::Type::Int:
189 case QMetaType::Type::UInt:
190 case QMetaType::Type::LongLong:
191 case QMetaType::Type::ULongLong:
192 case QMetaType::Type::Double:
193 case QMetaType::Type::QVariantMap:
194 case QMetaType::Type::QVariantList:
195 case QMetaType::Type::QStringList:
196 case QMetaType::Type::QUrl:
197 case QMetaType::Type::QLocale:
198 case QMetaType::Type::QRegularExpression:
199 case QMetaType::Type::QVariantHash:
200 case QMetaType::Type::QEasingCurve:
201 case QMetaType::Type::QModelIndex:
202 case QMetaType::Type::QPersistentModelIndex:
206 case QMetaType::Type::QDate:
207 if ( variant.toDate().isNull() )
209 if ( !silenceNullWarnings )
211 QgsDebugError( u
"NULL QDateTime was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
216 case QMetaType::Type::QTime:
217 if ( variant.toTime().isNull() )
219 if ( !silenceNullWarnings )
221 QgsDebugError( u
"NULL QTime was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
226 case QMetaType::Type::QDateTime:
227 if ( variant.toDate().isNull() )
229 if ( !silenceNullWarnings )
231 QgsDebugError( u
"NULL QDate was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
236 case QMetaType::Type::QChar:
237 if ( variant.toChar().isNull() )
239 if ( !silenceNullWarnings )
241 QgsDebugError( u
"NULL QChar was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
246 case QMetaType::Type::QString:
247 if ( variant.toString().isNull() )
249 if ( !silenceNullWarnings )
251 QgsDebugError( u
"NULL QString was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
256 case QMetaType::Type::QByteArray:
257 if ( variant.toByteArray().isNull() )
259 if ( !silenceNullWarnings )
261 QgsDebugError( u
"NULL QByteArray was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
266 case QMetaType::Type::QBitArray:
267 if ( variant.toBitArray().isNull() )
269 if ( !silenceNullWarnings )
271 QgsDebugError( u
"NULL QBitArray was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
276 case QMetaType::Type::QRect:
277 if ( variant.toRect().isNull() )
279 if ( !silenceNullWarnings )
281 QgsDebugError( u
"NULL QRect was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
286 case QMetaType::Type::QRectF:
287 if ( variant.toRectF().isNull() )
289 if ( !silenceNullWarnings )
291 QgsDebugError( u
"NULL QRectF was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
296 case QMetaType::Type::QSize:
297 if ( variant.toSize().isNull() )
299 if ( !silenceNullWarnings )
301 QgsDebugError( u
"NULL QSize was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
306 case QMetaType::Type::QSizeF:
307 if ( variant.toSizeF().isNull() )
309 if ( !silenceNullWarnings )
311 QgsDebugError( u
"NULL QSizeF was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
316 case QMetaType::Type::QLine:
317 if ( variant.toLine().isNull() )
319 if ( !silenceNullWarnings )
321 QgsDebugError( u
"NULL QLine was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
326 case QMetaType::Type::QLineF:
327 if ( variant.toLineF().isNull() )
329 if ( !silenceNullWarnings )
331 QgsDebugError( u
"NULL QLineF was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
336 case QMetaType::Type::QPoint:
337 if ( variant.toPoint().isNull() )
339 if ( !silenceNullWarnings )
341 QgsDebugError( u
"NULL QPoint was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
346 case QMetaType::Type::QPointF:
347 if ( variant.toPointF().isNull() )
349 if ( !silenceNullWarnings )
351 QgsDebugError( u
"NULL QPointF was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
356 case QMetaType::Type::QUuid:
357 if ( variant.toUuid().isNull() )
359 if ( !silenceNullWarnings )
361 QgsDebugError( u
"NULL QUuid was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
366 case QMetaType::Type::QPixmap:
367 if ( variant.value< QPixmap >().isNull() )
369 if ( !silenceNullWarnings )
371 QgsDebugError( u
"NULL QPixmap was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
376 case QMetaType::Type::QImage:
377 if ( variant.value< QImage >().isNull() )
379 if ( !silenceNullWarnings )
381 QgsDebugError( u
"NULL QImage was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
386 case QMetaType::Type::QRegion:
387 if ( variant.value< QRegion >().isNull() )
389 if ( !silenceNullWarnings )
391 QgsDebugError( u
"NULL QRegion was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
396 case QMetaType::Type::QBitmap:
397 if ( variant.value< QBitmap >().isNull() )
399 if ( !silenceNullWarnings )
401 QgsDebugError( u
"NULL QBitmap was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
406 case QMetaType::Type::QIcon:
407 if ( variant.value< QIcon >().isNull() )
409 if ( !silenceNullWarnings )
411 QgsDebugError( u
"NULL QIcon was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
416 case QMetaType::Type::QVector2D:
417 if ( variant.value< QVector2D >().isNull() )
419 if ( !silenceNullWarnings )
421 QgsDebugError( u
"NULL QVector2D was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
426 case QMetaType::Type::QVector3D:
427 if ( variant.value< QVector3D >().isNull() )
429 if ( !silenceNullWarnings )
431 QgsDebugError( u
"NULL QVector3D was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
436 case QMetaType::Type::QVector4D:
437 if ( variant.value< QVector4D >().isNull() )
439 if ( !silenceNullWarnings )
441 QgsDebugError( u
"NULL QVector4D was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
446 case QMetaType::Type::QQuaternion:
447 if ( variant.value< QQuaternion >().isNull() )
449 if ( !silenceNullWarnings )
451 QgsDebugError( u
"NULL QQuaternion was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
457 case QMetaType::Type::QColor:
458 case QMetaType::Type::QFont:
459 case QMetaType::Type::QBrush:
460 case QMetaType::Type::QPolygon:
461 case QMetaType::Type::QPalette:
462 case QMetaType::Type::QCursor:
463 case QMetaType::Type::QKeySequence:
464 case QMetaType::Type::QPen:
465 case QMetaType::Type::QTextLength:
466 case QMetaType::Type::QPolygonF:
467 case QMetaType::Type::QTextFormat:
468 case QMetaType::Type::QTransform:
469 case QMetaType::Type::QMatrix4x4:
470 case QMetaType::Type::QSizePolicy:
471 case QMetaType::Type::User:
512 case QMetaType::Bool:
514 case QMetaType::UInt:
515 case QMetaType::LongLong:
516 case QMetaType::ULongLong:
517 case QMetaType::Double:
518 case QMetaType::QChar:
519 case QMetaType::QVariantMap:
520 case QMetaType::QVariantList:
521 case QMetaType::QString:
522 case QMetaType::QStringList:
523 case QMetaType::QByteArray:
524 case QMetaType::QBitArray:
525 case QMetaType::QDate:
526 case QMetaType::QTime:
527 case QMetaType::QDateTime:
528 case QMetaType::QUrl:
529 case QMetaType::QLocale:
530 case QMetaType::QRect:
531 case QMetaType::QRectF:
532 case QMetaType::QSize:
533 case QMetaType::QSizeF:
534 case QMetaType::QLine:
535 case QMetaType::QLineF:
536 case QMetaType::QPoint:
537 case QMetaType::QPointF:
538 case QMetaType::QRegularExpression:
539 case QMetaType::QVariantHash:
540 case QMetaType::QEasingCurve:
541 case QMetaType::QUuid:
542 case QMetaType::QModelIndex:
543 case QMetaType::QPersistentModelIndex:
544 case QMetaType::QFont:
545 case QMetaType::QPixmap:
546 case QMetaType::QBrush:
547 case QMetaType::QColor:
548 case QMetaType::QPalette:
549 case QMetaType::QImage:
550 case QMetaType::QPolygon:
551 case QMetaType::QRegion:
552 case QMetaType::QBitmap:
553 case QMetaType::QCursor:
554 case QMetaType::QKeySequence:
555 case QMetaType::QPen:
556 case QMetaType::QTextLength:
557 case QMetaType::QTextFormat:
558 case QMetaType::QTransform:
559 case QMetaType::QMatrix4x4:
560 case QMetaType::QVector2D:
561 case QMetaType::QVector3D:
562 case QMetaType::QVector4D:
563 case QMetaType::QQuaternion:
564 case QMetaType::QPolygonF:
565 case QMetaType::QIcon:
566 case QMetaType::QSizePolicy:
567 case QMetaType::UnknownType:
568 case QMetaType::User:
569 return static_cast< QVariant::Type
>( metaType );
573 case QMetaType::Long:
574 return QVariant::Type::LongLong;
576 case QMetaType::ULong:
577 return QVariant::Type::ULongLong;
579 case QMetaType::Char:
580 case QMetaType::Char16:
581 case QMetaType::Char32:
582 case QMetaType::Short:
583 case QMetaType::SChar:
584 return QVariant::Type::Int;
586 case QMetaType::UShort:
587 case QMetaType::UChar:
588 return QVariant::Type::UInt;
590 case QMetaType::Float:
591#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
592 case QMetaType::Float16:
594 return QVariant::Type::Double;
597 case QMetaType::Nullptr:
598 case QMetaType::QCborSimpleType:
599 case QMetaType::Void:
600 case QMetaType::VoidStar:
601 case QMetaType::QVariant:
602 case QMetaType::QJsonValue:
603 case QMetaType::QJsonObject:
604 case QMetaType::QJsonArray:
605 case QMetaType::QJsonDocument:
606 case QMetaType::QCborValue:
607 case QMetaType::QCborArray:
608 case QMetaType::QCborMap:
609 case QMetaType::QObjectStar:
610 case QMetaType::QVariantPair:
611 case QMetaType::QByteArrayList:
612 case QMetaType::QColorSpace:
619 return QVariant::Type::UserType;
635 auto _displayString = [ ](
const QVariant & variant,
int precision ) -> QString
644 if ( variant.userType() == QMetaType::Type::Double )
647 if ( QLocale().decimalPoint() !=
'.' ||
648 !( QLocale().numberOptions() & QLocale::NumberOption::OmitGroupSeparator ) )
652 if ( -1 < variant.toDouble() && variant.toDouble() < 1 )
654 return QLocale().toString( variant.toDouble(),
'g', precision );
658 return QLocale().toString( variant.toDouble(),
'f', precision );
665 const QString str( variant.toString() );
666 const int dotPosition(
static_cast<int>( str.indexOf(
'.' ) ) );
668 if ( dotPosition < 0 && str.indexOf(
'e', 0, Qt::CaseInsensitive ) < 0 )
671 return QLocale().toString( variant.toDouble(),
'f', precision );
675 if ( dotPosition < 0 ) precision = 0;
676 else precision =
static_cast<int>( str.length() ) - dotPosition - 1;
678 if ( -1 < variant.toDouble() && variant.toDouble() < 1 )
680 return QLocale().toString( variant.toDouble(),
'g', precision );
684 return QLocale().toString( variant.toDouble(),
'f', precision );
690 else if ( precision > 0 )
692 if ( -1 < variant.toDouble() && variant.toDouble() < 1 )
694 return QString::number( variant.toDouble(),
'g', precision );
698 return QString::number( variant.toDouble(),
'f', precision );
704 !( QLocale().numberOptions() & QLocale::NumberOption::OmitGroupSeparator ) )
707 const qlonglong converted( variant.toLongLong( &ok ) );
709 return QLocale().toString( converted );
711 else if ( variant.userType() == QMetaType::Type::QByteArray )
713 return QObject::tr(
"BLOB" );
717 return variant.toString();
720 if ( variant.userType() == QMetaType::Type::QStringList || variant.userType() == QMetaType::Type::QVariantList )
723 const QVariantList list = variant.toList();
724 for (
const QVariant &var : list )
726 if ( !result.isEmpty() )
728 result.append(
';' );
730 result.append( _displayString( var, precision ) );
736 return _displayString( variant, precision );