44 case QMetaType::Type::UnknownType:
46 case QMetaType::Type::Bool:
47 return QObject::tr(
"Boolean" );
48 case QMetaType::Type::Int:
49 return QObject::tr(
"Integer (32 bit)" );
50 case QMetaType::Type::UInt:
51 return QObject::tr(
"Integer (unsigned 32 bit)" );
52 case QMetaType::Type::LongLong:
53 return QObject::tr(
"Integer (64 bit)" );
54 case QMetaType::Type::ULongLong:
55 return QObject::tr(
"Integer (unsigned 64 bit)" );
56 case QMetaType::Type::Double:
57 return QObject::tr(
"Decimal (double)" );
58 case QMetaType::Type::QChar:
59 return QObject::tr(
"Character" );
60 case QMetaType::Type::QVariantMap:
61 return QObject::tr(
"Map" );
62 case QMetaType::Type::QVariantList:
66 case QMetaType::Type::Int:
67 return QObject::tr(
"Integer List" );
68 case QMetaType::Type::LongLong:
69 return QObject::tr(
"Integer (64 bit) List" );
70 case QMetaType::Type::Double:
71 return QObject::tr(
"Decimal (double) List" );
73 return QObject::tr(
"List" );
76 case QMetaType::Type::QString:
77 return QObject::tr(
"Text (string)" );
78 case QMetaType::Type::QStringList:
79 return QObject::tr(
"String List" );
80 case QMetaType::Type::QByteArray:
81 return QObject::tr(
"Binary Object (BLOB)" );
82 case QMetaType::Type::QBitArray:
83 return QObject::tr(
"Bit Array" );
84 case QMetaType::Type::QDate:
85 return QObject::tr(
"Date" );
86 case QMetaType::Type::QTime:
87 return QObject::tr(
"Time" );
88 case QMetaType::Type::QDateTime:
89 return QObject::tr(
"Date & Time" );
90 case QMetaType::Type::QUrl:
91 return QObject::tr(
"URL" );
92 case QMetaType::Type::QLocale:
93 return QObject::tr(
"Locale" );
94 case QMetaType::Type::QRect:
95 case QMetaType::Type::QRectF:
96 return QObject::tr(
"Rectangle" );
97 case QMetaType::Type::QSize:
98 case QMetaType::Type::QSizeF:
99 return QObject::tr(
"Size" );
100 case QMetaType::Type::QLine:
101 case QMetaType::Type::QLineF:
102 return QObject::tr(
"Line" );
103 case QMetaType::Type::QPoint:
104 case QMetaType::Type::QPointF:
105 return QObject::tr(
"Point" );
106 case QMetaType::Type::QRegularExpression:
107 return QObject::tr(
"Regular Expression" );
108 case QMetaType::Type::QVariantHash:
109 return QObject::tr(
"Hash" );
110 case QMetaType::Type::QEasingCurve:
111 return QObject::tr(
"Easing Curve" );
112 case QMetaType::Type::QUuid:
113 return QObject::tr(
"UUID" );
114 case QMetaType::Type::QModelIndex:
115 case QMetaType::Type::QPersistentModelIndex:
116 return QObject::tr(
"Model Index" );
117 case QMetaType::Type::QFont:
118 return QObject::tr(
"Font" );
119 case QMetaType::Type::QPixmap:
120 return QObject::tr(
"Pixmap" );
121 case QMetaType::Type::QBrush:
122 return QObject::tr(
"Brush" );
123 case QMetaType::Type::QColor:
124 return QObject::tr(
"Color" );
125 case QMetaType::Type::QPalette:
126 return QObject::tr(
"Palette" );
127 case QMetaType::Type::QImage:
128 return QObject::tr(
"Image" );
129 case QMetaType::Type::QPolygon:
130 case QMetaType::Type::QPolygonF:
131 return QObject::tr(
"Polygon" );
132 case QMetaType::Type::QRegion:
133 return QObject::tr(
"Region" );
134 case QMetaType::Type::QBitmap:
135 return QObject::tr(
"Bitmap" );
136 case QMetaType::Type::QCursor:
137 return QObject::tr(
"Cursor" );
138 case QMetaType::Type::QKeySequence:
139 return QObject::tr(
"Key Sequence" );
140 case QMetaType::Type::QPen:
141 return QObject::tr(
"Pen" );
142 case QMetaType::Type::QTextLength:
143 return QObject::tr(
"Text Length" );
144 case QMetaType::Type::QTextFormat:
145 return QObject::tr(
"Text Format" );
146 case QMetaType::Type::QMatrix4x4:
147 return QObject::tr(
"Matrix" );
148 case QMetaType::Type::QTransform:
149 return QObject::tr(
"Transform" );
150 case QMetaType::Type::QVector2D:
151 case QMetaType::Type::QVector3D:
152 case QMetaType::Type::QVector4D:
153 return QObject::tr(
"Vector" );
154 case QMetaType::Type::QQuaternion:
155 return QObject::tr(
"Quaternion" );
156 case QMetaType::Type::QIcon:
157 return QObject::tr(
"Icon" );
158 case QMetaType::Type::QSizePolicy:
159 return QObject::tr(
"Size Policy" );
175 ( void )silenceNullWarnings;
178 if ( variant.isNull() || !variant.isValid() )
181 switch ( variant.userType() )
183 case QMetaType::Type::UnknownType:
184 case QMetaType::Type::Bool:
185 case QMetaType::Type::Int:
186 case QMetaType::Type::UInt:
187 case QMetaType::Type::LongLong:
188 case QMetaType::Type::ULongLong:
189 case QMetaType::Type::Double:
190 case QMetaType::Type::QVariantMap:
191 case QMetaType::Type::QVariantList:
192 case QMetaType::Type::QStringList:
193 case QMetaType::Type::QUrl:
194 case QMetaType::Type::QLocale:
195 case QMetaType::Type::QRegularExpression:
196 case QMetaType::Type::QVariantHash:
197 case QMetaType::Type::QEasingCurve:
198 case QMetaType::Type::QModelIndex:
199 case QMetaType::Type::QPersistentModelIndex:
203 case QMetaType::Type::QDate:
204 if ( variant.toDate().isNull() )
206 if ( !silenceNullWarnings )
208 QgsDebugError( QStringLiteral(
"NULL QDateTime was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
213 case QMetaType::Type::QTime:
214 if ( variant.toTime().isNull() )
216 if ( !silenceNullWarnings )
218 QgsDebugError( QStringLiteral(
"NULL QTime was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
223 case QMetaType::Type::QDateTime:
224 if ( variant.toDate().isNull() )
226 if ( !silenceNullWarnings )
228 QgsDebugError( QStringLiteral(
"NULL QDate was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
233 case QMetaType::Type::QChar:
234 if ( variant.toChar().isNull() )
236 if ( !silenceNullWarnings )
238 QgsDebugError( QStringLiteral(
"NULL QChar was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
243 case QMetaType::Type::QString:
244 if ( variant.toString().isNull() )
246 if ( !silenceNullWarnings )
248 QgsDebugError( QStringLiteral(
"NULL QString was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
253 case QMetaType::Type::QByteArray:
254 if ( variant.toByteArray().isNull() )
256 if ( !silenceNullWarnings )
258 QgsDebugError( QStringLiteral(
"NULL QByteArray was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
263 case QMetaType::Type::QBitArray:
264 if ( variant.toBitArray().isNull() )
266 if ( !silenceNullWarnings )
268 QgsDebugError( QStringLiteral(
"NULL QBitArray was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
273 case QMetaType::Type::QRect:
274 if ( variant.toRect().isNull() )
276 if ( !silenceNullWarnings )
278 QgsDebugError( QStringLiteral(
"NULL QRect was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
283 case QMetaType::Type::QRectF:
284 if ( variant.toRectF().isNull() )
286 if ( !silenceNullWarnings )
288 QgsDebugError( QStringLiteral(
"NULL QRectF was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
293 case QMetaType::Type::QSize:
294 if ( variant.toSize().isNull() )
296 if ( !silenceNullWarnings )
298 QgsDebugError( QStringLiteral(
"NULL QSize was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
303 case QMetaType::Type::QSizeF:
304 if ( variant.toSizeF().isNull() )
306 if ( !silenceNullWarnings )
308 QgsDebugError( QStringLiteral(
"NULL QSizeF was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
313 case QMetaType::Type::QLine:
314 if ( variant.toLine().isNull() )
316 if ( !silenceNullWarnings )
318 QgsDebugError( QStringLiteral(
"NULL QLine was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
323 case QMetaType::Type::QLineF:
324 if ( variant.toLineF().isNull() )
326 if ( !silenceNullWarnings )
328 QgsDebugError( QStringLiteral(
"NULL QLineF was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
333 case QMetaType::Type::QPoint:
334 if ( variant.toPoint().isNull() )
336 if ( !silenceNullWarnings )
338 QgsDebugError( QStringLiteral(
"NULL QPoint was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
343 case QMetaType::Type::QPointF:
344 if ( variant.toPointF().isNull() )
346 if ( !silenceNullWarnings )
348 QgsDebugError( QStringLiteral(
"NULL QPointF was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
353 case QMetaType::Type::QUuid:
354 if ( variant.toUuid().isNull() )
356 if ( !silenceNullWarnings )
358 QgsDebugError( QStringLiteral(
"NULL QUuid was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
363 case QMetaType::Type::QPixmap:
364 if ( variant.value< QPixmap >().isNull() )
366 if ( !silenceNullWarnings )
368 QgsDebugError( QStringLiteral(
"NULL QPixmap was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
373 case QMetaType::Type::QImage:
374 if ( variant.value< QImage >().isNull() )
376 if ( !silenceNullWarnings )
378 QgsDebugError( QStringLiteral(
"NULL QImage was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
383 case QMetaType::Type::QRegion:
384 if ( variant.value< QRegion >().isNull() )
386 if ( !silenceNullWarnings )
388 QgsDebugError( QStringLiteral(
"NULL QRegion was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
393 case QMetaType::Type::QBitmap:
394 if ( variant.value< QBitmap >().isNull() )
396 if ( !silenceNullWarnings )
398 QgsDebugError( QStringLiteral(
"NULL QBitmap was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
403 case QMetaType::Type::QIcon:
404 if ( variant.value< QIcon >().isNull() )
406 if ( !silenceNullWarnings )
408 QgsDebugError( QStringLiteral(
"NULL QIcon was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
413 case QMetaType::Type::QVector2D:
414 if ( variant.value< QVector2D >().isNull() )
416 if ( !silenceNullWarnings )
418 QgsDebugError( QStringLiteral(
"NULL QVector2D was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
423 case QMetaType::Type::QVector3D:
424 if ( variant.value< QVector3D >().isNull() )
426 if ( !silenceNullWarnings )
428 QgsDebugError( QStringLiteral(
"NULL QVector3D was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
433 case QMetaType::Type::QVector4D:
434 if ( variant.value< QVector4D >().isNull() )
436 if ( !silenceNullWarnings )
438 QgsDebugError( QStringLiteral(
"NULL QVector4D was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
443 case QMetaType::Type::QQuaternion:
444 if ( variant.value< QQuaternion >().isNull() )
446 if ( !silenceNullWarnings )
448 QgsDebugError( QStringLiteral(
"NULL QQuaternion was stored in a QVariant -- stop it! Always use an invalid QVariant() instead." ) );
454 case QMetaType::Type::QColor:
455 case QMetaType::Type::QFont:
456 case QMetaType::Type::QBrush:
457 case QMetaType::Type::QPolygon:
458 case QMetaType::Type::QPalette:
459 case QMetaType::Type::QCursor:
460 case QMetaType::Type::QKeySequence:
461 case QMetaType::Type::QPen:
462 case QMetaType::Type::QTextLength:
463 case QMetaType::Type::QPolygonF:
464 case QMetaType::Type::QTextFormat:
465 case QMetaType::Type::QTransform:
466 case QMetaType::Type::QMatrix4x4:
467 case QMetaType::Type::QSizePolicy:
468 case QMetaType::Type::User:
509 case QMetaType::Bool:
511 case QMetaType::UInt:
512 case QMetaType::LongLong:
513 case QMetaType::ULongLong:
514 case QMetaType::Double:
515 case QMetaType::QChar:
516 case QMetaType::QVariantMap:
517 case QMetaType::QVariantList:
518 case QMetaType::QString:
519 case QMetaType::QStringList:
520 case QMetaType::QByteArray:
521 case QMetaType::QBitArray:
522 case QMetaType::QDate:
523 case QMetaType::QTime:
524 case QMetaType::QDateTime:
525 case QMetaType::QUrl:
526 case QMetaType::QLocale:
527 case QMetaType::QRect:
528 case QMetaType::QRectF:
529 case QMetaType::QSize:
530 case QMetaType::QSizeF:
531 case QMetaType::QLine:
532 case QMetaType::QLineF:
533 case QMetaType::QPoint:
534 case QMetaType::QPointF:
535 case QMetaType::QRegularExpression:
536 case QMetaType::QVariantHash:
537 case QMetaType::QEasingCurve:
538 case QMetaType::QUuid:
539 case QMetaType::QModelIndex:
540 case QMetaType::QPersistentModelIndex:
541 case QMetaType::QFont:
542 case QMetaType::QPixmap:
543 case QMetaType::QBrush:
544 case QMetaType::QColor:
545 case QMetaType::QPalette:
546 case QMetaType::QImage:
547 case QMetaType::QPolygon:
548 case QMetaType::QRegion:
549 case QMetaType::QBitmap:
550 case QMetaType::QCursor:
551 case QMetaType::QKeySequence:
552 case QMetaType::QPen:
553 case QMetaType::QTextLength:
554 case QMetaType::QTextFormat:
555 case QMetaType::QTransform:
556 case QMetaType::QMatrix4x4:
557 case QMetaType::QVector2D:
558 case QMetaType::QVector3D:
559 case QMetaType::QVector4D:
560 case QMetaType::QQuaternion:
561 case QMetaType::QPolygonF:
562 case QMetaType::QIcon:
563 case QMetaType::QSizePolicy:
564 case QMetaType::UnknownType:
565 case QMetaType::User:
566 return static_cast< QVariant::Type
>( metaType );
570 case QMetaType::Long:
571 return QVariant::Type::LongLong;
573 case QMetaType::ULong:
574 return QVariant::Type::ULongLong;
576 case QMetaType::Char:
577#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
578 case QMetaType::Char16:
579 case QMetaType::Char32:
581 case QMetaType::Short:
582 case QMetaType::SChar:
583 return QVariant::Type::Int;
585 case QMetaType::UShort:
586 case QMetaType::UChar:
587 return QVariant::Type::UInt;
589 case QMetaType::Float:
590#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
591 case QMetaType::Float16:
593 return QVariant::Type::Double;
596 case QMetaType::Nullptr:
597 case QMetaType::QCborSimpleType:
598 case QMetaType::Void:
599 case QMetaType::VoidStar:
600 case QMetaType::QVariant:
601 case QMetaType::QJsonValue:
602 case QMetaType::QJsonObject:
603 case QMetaType::QJsonArray:
604 case QMetaType::QJsonDocument:
605 case QMetaType::QCborValue:
606 case QMetaType::QCborArray:
607 case QMetaType::QCborMap:
608 case QMetaType::QObjectStar:
609#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
610 case QMetaType::QVariantPair:
612 case QMetaType::QByteArrayList:
613 case QMetaType::QColorSpace:
620 return QVariant::Type::UserType;
641 auto _displayString = [ ](
const QVariant & variant,
int precision ) -> QString
650 if ( variant.userType() == QMetaType::Type::Double )
653 if ( QLocale().decimalPoint() !=
'.' ||
654 !( QLocale().numberOptions() & QLocale::NumberOption::OmitGroupSeparator ) )
658 if ( -1 < variant.toDouble() && variant.toDouble() < 1 )
660 return QLocale().toString( variant.toDouble(),
'g', precision );
664 return QLocale().toString( variant.toDouble(),
'f', precision );
671 const QString str( variant.toString() );
672 const int dotPosition(
static_cast<int>( str.indexOf(
'.' ) ) );
674 if ( dotPosition < 0 && str.indexOf(
'e', 0, Qt::CaseInsensitive ) < 0 )
677 return QLocale().toString( variant.toDouble(),
'f', precision );
681 if ( dotPosition < 0 ) precision = 0;
682 else precision =
static_cast<int>( str.length() ) - dotPosition - 1;
684 if ( -1 < variant.toDouble() && variant.toDouble() < 1 )
686 return QLocale().toString( variant.toDouble(),
'g', precision );
690 return QLocale().toString( variant.toDouble(),
'f', precision );
696 else if ( precision > 0 )
698 if ( -1 < variant.toDouble() && variant.toDouble() < 1 )
700 return QString::number( variant.toDouble(),
'g', precision );
704 return QString::number( variant.toDouble(),
'f', precision );
710 !( QLocale().numberOptions() & QLocale::NumberOption::OmitGroupSeparator ) )
713 const qlonglong converted( variant.toLongLong( &ok ) );
715 return QLocale().toString( converted );
717 else if ( variant.userType() == QMetaType::Type::QByteArray )
719 return QObject::tr(
"BLOB" );
723 return variant.toString();
726 if ( variant.userType() == QMetaType::Type::QStringList || variant.userType() == QMetaType::Type::QVariantList )
729 const QVariantList list = variant.toList();
730 for (
const QVariant &var : list )
732 if ( !result.isEmpty() )
734 result.append(
';' );
736 result.append( _displayString( var, precision ) );
742 return _displayString( variant, precision );