48 case QMetaType::Type::UnknownType:
50 case QMetaType::Type::Bool:
51 return QObject::tr(
"Boolean" );
52 case QMetaType::Type::Int:
53 return QObject::tr(
"Integer (32 bit)" );
54 case QMetaType::Type::UInt:
55 return QObject::tr(
"Integer (unsigned 32 bit)" );
56 case QMetaType::Type::LongLong:
57 return QObject::tr(
"Integer (64 bit)" );
58 case QMetaType::Type::ULongLong:
59 return QObject::tr(
"Integer (unsigned 64 bit)" );
60 case QMetaType::Type::Double:
61 return QObject::tr(
"Decimal (double)" );
62 case QMetaType::Type::QChar:
63 return QObject::tr(
"Character" );
64 case QMetaType::Type::QVariantMap:
65 return QObject::tr(
"Map" );
66 case QMetaType::Type::QVariantList:
70 case QMetaType::Type::Int:
71 return QObject::tr(
"Integer List" );
72 case QMetaType::Type::LongLong:
73 return QObject::tr(
"Integer (64 bit) List" );
74 case QMetaType::Type::Double:
75 return QObject::tr(
"Decimal (double) List" );
77 return QObject::tr(
"List" );
80 case QMetaType::Type::QString:
81 return QObject::tr(
"Text (string)" );
82 case QMetaType::Type::QStringList:
83 return QObject::tr(
"String List" );
84 case QMetaType::Type::QByteArray:
85 return QObject::tr(
"Binary Object (BLOB)" );
86 case QMetaType::Type::QBitArray:
87 return QObject::tr(
"Bit Array" );
88 case QMetaType::Type::QDate:
89 return QObject::tr(
"Date" );
90 case QMetaType::Type::QTime:
91 return QObject::tr(
"Time" );
92 case QMetaType::Type::QDateTime:
93 return QObject::tr(
"Date & Time" );
94 case QMetaType::Type::QUrl:
95 return QObject::tr(
"URL" );
96 case QMetaType::Type::QLocale:
97 return QObject::tr(
"Locale" );
98 case QMetaType::Type::QRect:
99 case QMetaType::Type::QRectF:
100 return QObject::tr(
"Rectangle" );
101 case QMetaType::Type::QSize:
102 case QMetaType::Type::QSizeF:
103 return QObject::tr(
"Size" );
104 case QMetaType::Type::QLine:
105 case QMetaType::Type::QLineF:
106 return QObject::tr(
"Line" );
107 case QMetaType::Type::QPoint:
108 case QMetaType::Type::QPointF:
109 return QObject::tr(
"Point" );
110 case QMetaType::Type::QRegularExpression:
111 return QObject::tr(
"Regular Expression" );
112 case QMetaType::Type::QVariantHash:
113 return QObject::tr(
"Hash" );
114 case QMetaType::Type::QEasingCurve:
115 return QObject::tr(
"Easing Curve" );
116 case QMetaType::Type::QUuid:
117 return QObject::tr(
"UUID" );
118 case QMetaType::Type::QModelIndex:
119 case QMetaType::Type::QPersistentModelIndex:
120 return QObject::tr(
"Model Index" );
121 case QMetaType::Type::QFont:
122 return QObject::tr(
"Font" );
123 case QMetaType::Type::QPixmap:
124 return QObject::tr(
"Pixmap" );
125 case QMetaType::Type::QBrush:
126 return QObject::tr(
"Brush" );
127 case QMetaType::Type::QColor:
128 return QObject::tr(
"Color" );
129 case QMetaType::Type::QPalette:
130 return QObject::tr(
"Palette" );
131 case QMetaType::Type::QImage:
132 return QObject::tr(
"Image" );
133 case QMetaType::Type::QPolygon:
134 case QMetaType::Type::QPolygonF:
135 return QObject::tr(
"Polygon" );
136 case QMetaType::Type::QRegion:
137 return QObject::tr(
"Region" );
138 case QMetaType::Type::QBitmap:
139 return QObject::tr(
"Bitmap" );
140 case QMetaType::Type::QCursor:
141 return QObject::tr(
"Cursor" );
142 case QMetaType::Type::QKeySequence:
143 return QObject::tr(
"Key Sequence" );
144 case QMetaType::Type::QPen:
145 return QObject::tr(
"Pen" );
146 case QMetaType::Type::QTextLength:
147 return QObject::tr(
"Text Length" );
148 case QMetaType::Type::QTextFormat:
149 return QObject::tr(
"Text Format" );
150 case QMetaType::Type::QMatrix4x4:
151 return QObject::tr(
"Matrix" );
152 case QMetaType::Type::QTransform:
153 return QObject::tr(
"Transform" );
154 case QMetaType::Type::QVector2D:
155 case QMetaType::Type::QVector3D:
156 case QMetaType::Type::QVector4D:
157 return QObject::tr(
"Vector" );
158 case QMetaType::Type::QQuaternion:
159 return QObject::tr(
"Quaternion" );
160 case QMetaType::Type::QIcon:
161 return QObject::tr(
"Icon" );
162 case QMetaType::Type::QSizePolicy:
163 return QObject::tr(
"Size Policy" );
179 ( void ) silenceNullWarnings;
182 if ( variant.isNull() || !variant.isValid() )
185 switch ( variant.userType() )
187 case QMetaType::Type::UnknownType:
188 case QMetaType::Type::Bool:
189 case QMetaType::Type::Int:
190 case QMetaType::Type::UInt:
191 case QMetaType::Type::LongLong:
192 case QMetaType::Type::ULongLong:
193 case QMetaType::Type::Double:
194 case QMetaType::Type::QVariantMap:
195 case QMetaType::Type::QVariantList:
196 case QMetaType::Type::QStringList:
197 case QMetaType::Type::QUrl:
198 case QMetaType::Type::QLocale:
199 case QMetaType::Type::QRegularExpression:
200 case QMetaType::Type::QVariantHash:
201 case QMetaType::Type::QEasingCurve:
202 case QMetaType::Type::QModelIndex:
203 case QMetaType::Type::QPersistentModelIndex:
207 case QMetaType::Type::QDate:
208 if ( variant.toDate().isNull() )
210 if ( !silenceNullWarnings )
212 QgsDebugError( u
"NULL QDateTime was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
217 case QMetaType::Type::QTime:
218 if ( variant.toTime().isNull() )
220 if ( !silenceNullWarnings )
222 QgsDebugError( u
"NULL QTime was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
227 case QMetaType::Type::QDateTime:
228 if ( variant.toDate().isNull() )
230 if ( !silenceNullWarnings )
232 QgsDebugError( u
"NULL QDate was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
237 case QMetaType::Type::QChar:
238 if ( variant.toChar().isNull() )
240 if ( !silenceNullWarnings )
242 QgsDebugError( u
"NULL QChar was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
247 case QMetaType::Type::QString:
248 if ( variant.toString().isNull() )
250 if ( !silenceNullWarnings )
252 QgsDebugError( u
"NULL QString was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
257 case QMetaType::Type::QByteArray:
258 if ( variant.toByteArray().isNull() )
260 if ( !silenceNullWarnings )
262 QgsDebugError( u
"NULL QByteArray was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
267 case QMetaType::Type::QBitArray:
268 if ( variant.toBitArray().isNull() )
270 if ( !silenceNullWarnings )
272 QgsDebugError( u
"NULL QBitArray was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
277 case QMetaType::Type::QRect:
278 if ( variant.toRect().isNull() )
280 if ( !silenceNullWarnings )
282 QgsDebugError( u
"NULL QRect was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
287 case QMetaType::Type::QRectF:
288 if ( variant.toRectF().isNull() )
290 if ( !silenceNullWarnings )
292 QgsDebugError( u
"NULL QRectF was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
297 case QMetaType::Type::QSize:
298 if ( variant.toSize().isNull() )
300 if ( !silenceNullWarnings )
302 QgsDebugError( u
"NULL QSize was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
307 case QMetaType::Type::QSizeF:
308 if ( variant.toSizeF().isNull() )
310 if ( !silenceNullWarnings )
312 QgsDebugError( u
"NULL QSizeF was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
317 case QMetaType::Type::QLine:
318 if ( variant.toLine().isNull() )
320 if ( !silenceNullWarnings )
322 QgsDebugError( u
"NULL QLine was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
327 case QMetaType::Type::QLineF:
328 if ( variant.toLineF().isNull() )
330 if ( !silenceNullWarnings )
332 QgsDebugError( u
"NULL QLineF was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
337 case QMetaType::Type::QPoint:
338 if ( variant.toPoint().isNull() )
340 if ( !silenceNullWarnings )
342 QgsDebugError( u
"NULL QPoint was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
347 case QMetaType::Type::QPointF:
348 if ( variant.toPointF().isNull() )
350 if ( !silenceNullWarnings )
352 QgsDebugError( u
"NULL QPointF was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
357 case QMetaType::Type::QUuid:
358 if ( variant.toUuid().isNull() )
360 if ( !silenceNullWarnings )
362 QgsDebugError( u
"NULL QUuid was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
367 case QMetaType::Type::QPixmap:
368 if ( variant.value< QPixmap >().isNull() )
370 if ( !silenceNullWarnings )
372 QgsDebugError( u
"NULL QPixmap was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
377 case QMetaType::Type::QImage:
378 if ( variant.value< QImage >().isNull() )
380 if ( !silenceNullWarnings )
382 QgsDebugError( u
"NULL QImage was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
387 case QMetaType::Type::QRegion:
388 if ( variant.value< QRegion >().isNull() )
390 if ( !silenceNullWarnings )
392 QgsDebugError( u
"NULL QRegion was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
397 case QMetaType::Type::QBitmap:
398 if ( variant.value< QBitmap >().isNull() )
400 if ( !silenceNullWarnings )
402 QgsDebugError( u
"NULL QBitmap was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
407 case QMetaType::Type::QIcon:
408 if ( variant.value< QIcon >().isNull() )
410 if ( !silenceNullWarnings )
412 QgsDebugError( u
"NULL QIcon was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
417 case QMetaType::Type::QVector2D:
418 if ( variant.value< QVector2D >().isNull() )
420 if ( !silenceNullWarnings )
422 QgsDebugError( u
"NULL QVector2D was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
427 case QMetaType::Type::QVector3D:
428 if ( variant.value< QVector3D >().isNull() )
430 if ( !silenceNullWarnings )
432 QgsDebugError( u
"NULL QVector3D was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
437 case QMetaType::Type::QVector4D:
438 if ( variant.value< QVector4D >().isNull() )
440 if ( !silenceNullWarnings )
442 QgsDebugError( u
"NULL QVector4D was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
447 case QMetaType::Type::QQuaternion:
448 if ( variant.value< QQuaternion >().isNull() )
450 if ( !silenceNullWarnings )
452 QgsDebugError( u
"NULL QQuaternion was stored in a QVariant -- stop it! Always use an invalid QVariant() instead."_s );
458 case QMetaType::Type::QColor:
459 case QMetaType::Type::QFont:
460 case QMetaType::Type::QBrush:
461 case QMetaType::Type::QPolygon:
462 case QMetaType::Type::QPalette:
463 case QMetaType::Type::QCursor:
464 case QMetaType::Type::QKeySequence:
465 case QMetaType::Type::QPen:
466 case QMetaType::Type::QTextLength:
467 case QMetaType::Type::QPolygonF:
468 case QMetaType::Type::QTextFormat:
469 case QMetaType::Type::QTransform:
470 case QMetaType::Type::QMatrix4x4:
471 case QMetaType::Type::QSizePolicy:
472 case QMetaType::Type::User:
513 case QMetaType::Bool:
515 case QMetaType::UInt:
516 case QMetaType::LongLong:
517 case QMetaType::ULongLong:
518 case QMetaType::Double:
519 case QMetaType::QChar:
520 case QMetaType::QVariantMap:
521 case QMetaType::QVariantList:
522 case QMetaType::QString:
523 case QMetaType::QStringList:
524 case QMetaType::QByteArray:
525 case QMetaType::QBitArray:
526 case QMetaType::QDate:
527 case QMetaType::QTime:
528 case QMetaType::QDateTime:
529 case QMetaType::QUrl:
530 case QMetaType::QLocale:
531 case QMetaType::QRect:
532 case QMetaType::QRectF:
533 case QMetaType::QSize:
534 case QMetaType::QSizeF:
535 case QMetaType::QLine:
536 case QMetaType::QLineF:
537 case QMetaType::QPoint:
538 case QMetaType::QPointF:
539 case QMetaType::QRegularExpression:
540 case QMetaType::QVariantHash:
541 case QMetaType::QEasingCurve:
542 case QMetaType::QUuid:
543 case QMetaType::QModelIndex:
544 case QMetaType::QPersistentModelIndex:
545 case QMetaType::QFont:
546 case QMetaType::QPixmap:
547 case QMetaType::QBrush:
548 case QMetaType::QColor:
549 case QMetaType::QPalette:
550 case QMetaType::QImage:
551 case QMetaType::QPolygon:
552 case QMetaType::QRegion:
553 case QMetaType::QBitmap:
554 case QMetaType::QCursor:
555 case QMetaType::QKeySequence:
556 case QMetaType::QPen:
557 case QMetaType::QTextLength:
558 case QMetaType::QTextFormat:
559 case QMetaType::QTransform:
560 case QMetaType::QMatrix4x4:
561 case QMetaType::QVector2D:
562 case QMetaType::QVector3D:
563 case QMetaType::QVector4D:
564 case QMetaType::QQuaternion:
565 case QMetaType::QPolygonF:
566 case QMetaType::QIcon:
567 case QMetaType::QSizePolicy:
568 case QMetaType::UnknownType:
569 case QMetaType::User:
570 return static_cast< QVariant::Type
>( metaType );
574 case QMetaType::Long:
575 return QVariant::Type::LongLong;
577 case QMetaType::ULong:
578 return QVariant::Type::ULongLong;
580 case QMetaType::Char:
581 case QMetaType::Char16:
582 case QMetaType::Char32:
583 case QMetaType::Short:
584 case QMetaType::SChar:
585 return QVariant::Type::Int;
587 case QMetaType::UShort:
588 case QMetaType::UChar:
589 return QVariant::Type::UInt;
591 case QMetaType::Float:
592 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 case QMetaType::QVariantPair:
610 case QMetaType::QByteArrayList:
611 case QMetaType::QColorSpace:
618 return QVariant::Type::UserType;
633 auto _displayString = [](
const QVariant &variant,
int precision ) -> QString {
640 if ( variant.userType() == QMetaType::Type::Double )
643 if ( QLocale().decimalPoint() !=
'.' || !( QLocale().numberOptions() & QLocale::NumberOption::OmitGroupSeparator ) )
647 if ( -1 < variant.toDouble() && variant.toDouble() < 1 )
649 return QLocale().toString( variant.toDouble(),
'g', precision );
653 return QLocale().toString( variant.toDouble(),
'f', precision );
660 const QString str( variant.toString() );
661 const int dotPosition(
static_cast<int>( str.indexOf(
'.' ) ) );
663 if ( dotPosition < 0 && str.indexOf(
'e', 0, Qt::CaseInsensitive ) < 0 )
666 return QLocale().toString( variant.toDouble(),
'f', precision );
670 if ( dotPosition < 0 )
673 precision =
static_cast<int>( str.length() ) - dotPosition - 1;
675 if ( -1 < variant.toDouble() && variant.toDouble() < 1 )
677 return QLocale().toString( variant.toDouble(),
'g', precision );
681 return QLocale().toString( variant.toDouble(),
'f', precision );
687 else if ( precision > 0 )
689 if ( -1 < variant.toDouble() && variant.toDouble() < 1 )
691 return QString::number( variant.toDouble(),
'g', precision );
695 return QString::number( variant.toDouble(),
'f', precision );
700 else if (
QgsVariantUtils::isNumericType(
static_cast< QMetaType::Type
>( variant.userType() ) ) && !( QLocale().numberOptions() & QLocale::NumberOption::OmitGroupSeparator ) )
703 const qlonglong converted( variant.toLongLong( &ok ) );
705 return QLocale().toString( converted );
707 else if ( variant.userType() == QMetaType::Type::QByteArray )
709 return QObject::tr(
"BLOB" );
713 return variant.toString();
716 if ( variant.userType() == QMetaType::Type::QStringList || variant.userType() == QMetaType::Type::QVariantList )
719 const QVariantList list = variant.toList();
720 for (
const QVariant &var : list )
722 if ( !result.isEmpty() )
724 result.append(
';' );
726 result.append( _displayString( var, precision ) );
732 return _displayString( variant, precision );
739 if ( !title.isEmpty() )
741 result += u
"<tr><td class=\"highlight\">%1</td><td></td></tr>"_s.arg( title );
743 for (
auto it = variantMap.constBegin(); it != variantMap.constEnd(); ++it )
745 if ( ( it.value().type() == QVariant::List || it.value().type() == QVariant::StringList ) )
747 const QVariantList childList = it.value().toList();
748 result += u
"<tr><td class=\"highlight\">%1</td><td><ul>"_s.arg( it.key() );
749 for (
const QVariant &v : childList )
751 if ( v.type() == QVariant::Map )
753 const QVariantMap grandChildMap = v.toMap();
754 result += u
"<li><table>%1</table></li>"_s.arg(
variantToHtml( grandChildMap ) );
761 result +=
"</ul></td></tr>"_L1;
763 else if ( it.value().type() == QVariant::Map )
765 const QVariantMap childMap = it.value().toMap();
766 result += u
"<tr><td class=\"highlight\">%1</td><td><table>%2</table></td></tr>"_s.arg( it.key(),
variantToHtml( childMap ) );
770 result += u
"<tr><td class=\"highlight\">%1</td><td>%2</td></tr>"_s.arg( it.key(),
QgsStringUtils::insertLinks( it.value().toString() ) );