1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: http://www.qt-project.org/
7 ** This file is part of the QtCore module of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
43 #include "qbitarray.h"
44 #include "qbytearray.h"
45 #include "qdatastream.h"
48 #include "qdatetime.h"
49 #include "qeasingcurve.h"
52 #include "qstringlist.h"
56 #ifndef QT_BOOTSTRAPPED
57 #include "qabstractitemmodel.h"
59 #include "private/qvariant_p.h"
60 #include "qmetatype_p.h"
62 #ifndef QT_NO_GEOM_VARIANT
83 static const QVariant::Handler *Handlers[QModulesPrivate::ModulesCount];
85 const QVariant::Handler *operator[] (const int typeId) const
87 return Handlers[QModulesPrivate::moduleForType(typeId)];
90 void registerHandler(const QModulesPrivate::Names name, const QVariant::Handler *handler)
92 Handlers[name] = handler;
95 inline void unregisterHandler(const QModulesPrivate::Names name);
101 struct TypeDefiniton {
102 static const bool IsAvailable = true;
105 // Ignore these types, as incomplete
106 #ifdef QT_BOOTSTRAPPED
107 template<> struct TypeDefiniton<QEasingCurve> { static const bool IsAvailable = false; };
108 template<> struct TypeDefiniton<QModelIndex> { static const bool IsAvailable = false; };
110 #ifdef QT_NO_GEOM_VARIANT
111 template<> struct TypeDefiniton<QRect> { static const bool IsAvailable = false; };
112 template<> struct TypeDefiniton<QRectF> { static const bool IsAvailable = false; };
113 template<> struct TypeDefiniton<QSize> { static const bool IsAvailable = false; };
114 template<> struct TypeDefiniton<QSizeF> { static const bool IsAvailable = false; };
115 template<> struct TypeDefiniton<QLine> { static const bool IsAvailable = false; };
116 template<> struct TypeDefiniton<QLineF> { static const bool IsAvailable = false; };
117 template<> struct TypeDefiniton<QPoint> { static const bool IsAvailable = false; };
118 template<> struct TypeDefiniton<QPointF> { static const bool IsAvailable = false; };
121 struct CoreTypesFilter {
124 static const bool IsAccepted = QTypeModuleInfo<T>::IsCore && TypeDefiniton<T>::IsAvailable;
127 } // annonymous used to hide TypeDefiniton
129 namespace { // annonymous used to hide QVariant handlers
131 static void construct(QVariant::Private *x, const void *copy)
133 QVariantConstructor<CoreTypesFilter> constructor(x, copy);
134 QMetaTypeSwitcher::switcher<void>(constructor, x->type, 0);
137 static void clear(QVariant::Private *d)
139 QVariantDestructor<CoreTypesFilter> cleaner(d);
140 QMetaTypeSwitcher::switcher<void>(cleaner, d->type, 0);
143 static bool isNull(const QVariant::Private *d)
145 QVariantIsNull<CoreTypesFilter> isNull(d);
146 return QMetaTypeSwitcher::switcher<bool>(isNull, d->type, 0);
152 Compares \a a to \a b. The caller guarantees that \a a and \a b
153 are of the same type.
155 static bool compare(const QVariant::Private *a, const QVariant::Private *b)
157 QVariantComparator<CoreTypesFilter> comparator(a, b);
158 return QMetaTypeSwitcher::switcher<bool>(comparator, a->type, 0);
164 static qlonglong qMetaTypeNumber(const QVariant::Private *d)
169 case QMetaType::LongLong:
171 case QMetaType::Char:
172 return qlonglong(d->data.c);
173 case QMetaType::Short:
174 return qlonglong(d->data.s);
175 case QMetaType::Long:
176 return qlonglong(d->data.l);
177 case QMetaType::Float:
178 return qRound64(d->data.f);
179 case QVariant::Double:
180 return qRound64(d->data.d);
186 static qulonglong qMetaTypeUNumber(const QVariant::Private *d)
191 case QVariant::ULongLong:
193 case QMetaType::UChar:
195 case QMetaType::UShort:
197 case QMetaType::ULong:
204 static qlonglong qConvertToNumber(const QVariant::Private *d, bool *ok)
208 switch (uint(d->type)) {
209 case QVariant::String:
210 return v_cast<QString>(d)->toLongLong(ok);
212 return v_cast<QChar>(d)->unicode();
213 case QVariant::ByteArray:
214 return v_cast<QByteArray>(d)->toLongLong(ok);
216 return qlonglong(d->data.b);
217 case QVariant::Double:
219 case QMetaType::Char:
220 case QMetaType::Short:
221 case QMetaType::Long:
222 case QMetaType::Float:
223 case QMetaType::LongLong:
224 return qMetaTypeNumber(d);
225 case QVariant::ULongLong:
227 case QMetaType::UChar:
228 case QMetaType::UShort:
229 case QMetaType::ULong:
230 return qlonglong(qMetaTypeUNumber(d));
237 static qulonglong qConvertToUnsignedNumber(const QVariant::Private *d, bool *ok)
241 switch (uint(d->type)) {
242 case QVariant::String:
243 return v_cast<QString>(d)->toULongLong(ok);
245 return v_cast<QChar>(d)->unicode();
246 case QVariant::ByteArray:
247 return v_cast<QByteArray>(d)->toULongLong(ok);
249 return qulonglong(d->data.b);
250 case QVariant::Double:
252 case QMetaType::Char:
253 case QMetaType::Short:
254 case QMetaType::Long:
255 case QMetaType::Float:
256 case QMetaType::LongLong:
257 return qulonglong(qMetaTypeNumber(d));
258 case QVariant::ULongLong:
260 case QMetaType::UChar:
261 case QMetaType::UShort:
262 case QMetaType::ULong:
263 return qMetaTypeUNumber(d);
267 return Q_UINT64_C(0);
270 template<typename TInput, typename LiteralWrapper>
271 inline bool qt_convertToBool(const QVariant::Private *const d)
273 TInput str = v_cast<TInput>(d)->toLower();
274 return !(str == LiteralWrapper("0") || str == LiteralWrapper("false") || str.isEmpty());
280 Converts \a d to type \a t, which is placed in \a result.
282 static bool convert(const QVariant::Private *d, QVariant::Type t, void *result, bool *ok)
284 Q_ASSERT(d->type != uint(t));
294 case QVariant::String:
295 *static_cast<QUrl *>(result) = QUrl(*v_cast<QString>(d));
301 case QVariant::String: {
302 QString *str = static_cast<QString *>(result);
305 *str = QString(*v_cast<QChar>(d));
307 case QMetaType::Char:
308 case QMetaType::UChar:
309 *str = QChar::fromAscii(d->data.c);
311 case QMetaType::Short:
312 case QMetaType::Long:
314 case QVariant::LongLong:
315 *str = QString::number(qMetaTypeNumber(d));
318 case QVariant::ULongLong:
319 case QMetaType::UShort:
320 case QMetaType::ULong:
321 *str = QString::number(qMetaTypeUNumber(d));
323 case QMetaType::Float:
324 *str = QString::number(d->data.f, 'g', FLT_DIG);
326 case QVariant::Double:
327 *str = QString::number(d->data.d, 'g', DBL_DIG);
329 #if !defined(QT_NO_DATESTRING)
331 *str = v_cast<QDate>(d)->toString(Qt::ISODate);
334 *str = v_cast<QTime>(d)->toString(Qt::ISODate);
336 case QVariant::DateTime:
337 *str = v_cast<QDateTime>(d)->toString(Qt::ISODate);
341 *str = QLatin1String(d->data.b ? "true" : "false");
343 case QVariant::ByteArray:
344 *str = QString::fromAscii(v_cast<QByteArray>(d)->constData());
346 case QVariant::StringList:
347 if (v_cast<QStringList>(d)->count() == 1)
348 *str = v_cast<QStringList>(d)->at(0);
351 *str = v_cast<QUrl>(d)->toString();
354 *str = v_cast<QUuid>(d)->toString();
361 case QVariant::Char: {
362 QChar *c = static_cast<QChar *>(result);
365 case QVariant::LongLong:
366 case QMetaType::Char:
367 case QMetaType::Short:
368 case QMetaType::Long:
369 case QMetaType::Float:
370 *c = QChar(ushort(qMetaTypeNumber(d)));
373 case QVariant::ULongLong:
374 case QMetaType::UChar:
375 case QMetaType::UShort:
376 case QMetaType::ULong:
377 *c = QChar(ushort(qMetaTypeUNumber(d)));
384 #ifndef QT_NO_GEOM_VARIANT
385 case QVariant::Size: {
386 QSize *s = static_cast<QSize *>(result);
388 case QVariant::SizeF:
389 *s = v_cast<QSizeF>(d)->toSize();
397 case QVariant::SizeF: {
398 QSizeF *s = static_cast<QSizeF *>(result);
401 *s = QSizeF(*(v_cast<QSize>(d)));
409 case QVariant::Line: {
410 QLine *s = static_cast<QLine *>(result);
412 case QVariant::LineF:
413 *s = v_cast<QLineF>(d)->toLine();
421 case QVariant::LineF: {
422 QLineF *s = static_cast<QLineF *>(result);
425 *s = QLineF(*(v_cast<QLine>(d)));
433 case QVariant::StringList:
434 if (d->type == QVariant::List) {
435 QStringList *slst = static_cast<QStringList *>(result);
436 const QVariantList *list = v_cast<QVariantList >(d);
437 for (int i = 0; i < list->size(); ++i)
438 slst->append(list->at(i).toString());
439 } else if (d->type == QVariant::String) {
440 QStringList *slst = static_cast<QStringList *>(result);
441 *slst = QStringList(*v_cast<QString>(d));
446 case QVariant::Date: {
447 QDate *dt = static_cast<QDate *>(result);
448 if (d->type == QVariant::DateTime)
449 *dt = v_cast<QDateTime>(d)->date();
450 #ifndef QT_NO_DATESTRING
451 else if (d->type == QVariant::String)
452 *dt = QDate::fromString(*v_cast<QString>(d), Qt::ISODate);
457 return dt->isValid();
459 case QVariant::Time: {
460 QTime *t = static_cast<QTime *>(result);
462 case QVariant::DateTime:
463 *t = v_cast<QDateTime>(d)->time();
465 #ifndef QT_NO_DATESTRING
466 case QVariant::String:
467 *t = QTime::fromString(*v_cast<QString>(d), Qt::ISODate);
475 case QVariant::DateTime: {
476 QDateTime *dt = static_cast<QDateTime *>(result);
478 #ifndef QT_NO_DATESTRING
479 case QVariant::String:
480 *dt = QDateTime::fromString(*v_cast<QString>(d), Qt::ISODate);
484 *dt = QDateTime(*v_cast<QDate>(d));
489 return dt->isValid();
491 case QVariant::ByteArray: {
492 QByteArray *ba = static_cast<QByteArray *>(result);
494 case QVariant::String:
495 *ba = v_cast<QString>(d)->toAscii();
497 case QVariant::Double:
498 *ba = QByteArray::number(d->data.d, 'g', DBL_DIG);
500 case QMetaType::Float:
501 *ba = QByteArray::number(d->data.f, 'g', FLT_DIG);
503 case QMetaType::Char:
504 case QMetaType::UChar:
505 *ba = QByteArray(1, d->data.c);
508 case QVariant::LongLong:
509 case QMetaType::Short:
510 case QMetaType::Long:
511 *ba = QByteArray::number(qMetaTypeNumber(d));
514 case QVariant::ULongLong:
515 case QMetaType::UShort:
516 case QMetaType::ULong:
517 *ba = QByteArray::number(qMetaTypeUNumber(d));
520 *ba = QByteArray(d->data.b ? "true" : "false");
527 case QMetaType::Short:
528 *static_cast<short *>(result) = short(qConvertToNumber(d, ok));
530 case QMetaType::Long:
531 *static_cast<long *>(result) = long(qConvertToNumber(d, ok));
533 case QMetaType::UShort:
534 *static_cast<ushort *>(result) = ushort(qConvertToUnsignedNumber(d, ok));
536 case QMetaType::ULong:
537 *static_cast<ulong *>(result) = ulong(qConvertToUnsignedNumber(d, ok));
540 *static_cast<int *>(result) = int(qConvertToNumber(d, ok));
543 *static_cast<uint *>(result) = uint(qConvertToUnsignedNumber(d, ok));
545 case QVariant::LongLong:
546 *static_cast<qlonglong *>(result) = qConvertToNumber(d, ok);
548 case QVariant::ULongLong: {
549 *static_cast<qulonglong *>(result) = qConvertToUnsignedNumber(d, ok);
552 case QMetaType::UChar: {
553 *static_cast<uchar *>(result) = qConvertToUnsignedNumber(d, ok);
556 case QVariant::Bool: {
557 bool *b = static_cast<bool *>(result);
559 case QVariant::ByteArray:
560 *b = qt_convertToBool<QByteArray, QByteArray>(d);
562 case QVariant::String:
563 *b = qt_convertToBool<QString, QLatin1String>(d);
566 *b = !v_cast<QChar>(d)->isNull();
568 case QVariant::Double:
570 case QVariant::LongLong:
571 case QMetaType::Char:
572 case QMetaType::Short:
573 case QMetaType::Long:
574 case QMetaType::Float:
575 *b = qMetaTypeNumber(d) != Q_INT64_C(0);
578 case QVariant::ULongLong:
579 case QMetaType::UChar:
580 case QMetaType::UShort:
581 case QMetaType::ULong:
582 *b = qMetaTypeUNumber(d) != Q_UINT64_C(0);
590 case QVariant::Double: {
591 double *f = static_cast<double *>(result);
593 case QVariant::String:
594 *f = v_cast<QString>(d)->toDouble(ok);
596 case QVariant::ByteArray:
597 *f = v_cast<QByteArray>(d)->toDouble(ok);
600 *f = double(d->data.b);
602 case QMetaType::Float:
603 *f = double(d->data.f);
605 case QVariant::LongLong:
607 case QMetaType::Char:
608 case QMetaType::Short:
609 case QMetaType::Long:
610 *f = double(qMetaTypeNumber(d));
613 case QVariant::ULongLong:
614 case QMetaType::UChar:
615 case QMetaType::UShort:
616 case QMetaType::ULong:
617 *f = double(qMetaTypeUNumber(d));
625 case QMetaType::Float: {
626 float *f = static_cast<float *>(result);
628 case QVariant::String:
629 *f = v_cast<QString>(d)->toFloat(ok);
631 case QVariant::ByteArray:
632 *f = v_cast<QByteArray>(d)->toFloat(ok);
635 *f = float(d->data.b);
637 case QVariant::Double:
638 *f = float(d->data.d);
640 case QVariant::LongLong:
642 case QMetaType::Char:
643 case QMetaType::Short:
644 case QMetaType::Long:
645 *f = float(qMetaTypeNumber(d));
648 case QVariant::ULongLong:
649 case QMetaType::UChar:
650 case QMetaType::UShort:
651 case QMetaType::ULong:
652 *f = float(qMetaTypeUNumber(d));
661 if (d->type == QVariant::StringList) {
662 QVariantList *lst = static_cast<QVariantList *>(result);
663 const QStringList *slist = v_cast<QStringList>(d);
664 for (int i = 0; i < slist->size(); ++i)
665 lst->append(QVariant(slist->at(i)));
666 } else if (qstrcmp(QMetaType::typeName(d->type), "QList<QVariant>") == 0) {
667 *static_cast<QVariantList *>(result) =
668 *static_cast<QList<QVariant> *>(d->data.shared->ptr);
674 if (qstrcmp(QMetaType::typeName(d->type), "QMap<QString, QVariant>") == 0) {
675 *static_cast<QVariantMap *>(result) =
676 *static_cast<QMap<QString, QVariant> *>(d->data.shared->ptr);
682 if (qstrcmp(QMetaType::typeName(d->type), "QHash<QString, QVariant>") == 0) {
683 *static_cast<QVariantHash *>(result) =
684 *static_cast<QHash<QString, QVariant> *>(d->data.shared->ptr);
689 #ifndef QT_NO_GEOM_VARIANT
691 if (d->type == QVariant::RectF)
692 *static_cast<QRect *>(result) = (v_cast<QRectF>(d))->toRect();
696 case QVariant::RectF:
697 if (d->type == QVariant::Rect)
698 *static_cast<QRectF *>(result) = *v_cast<QRect>(d);
702 case QVariant::PointF:
703 if (d->type == QVariant::Point)
704 *static_cast<QPointF *>(result) = *v_cast<QPoint>(d);
708 case QVariant::Point:
709 if (d->type == QVariant::PointF)
710 *static_cast<QPoint *>(result) = (v_cast<QPointF>(d))->toPoint();
714 case QMetaType::Char:
716 *static_cast<qint8 *>(result) = qint8(qConvertToNumber(d, ok));
722 case QVariant::String:
723 *static_cast<QUuid *>(result) = QUuid(*v_cast<QString>(d));
735 #if !defined(QT_NO_DEBUG_STREAM) && !defined(Q_BROKEN_DEBUG_STREAM)
736 static void streamDebug(QDebug dbg, const QVariant &v)
738 QVariant::Private *d = const_cast<QVariant::Private *>(&v.data_ptr());
739 QVariantDebugStream<CoreTypesFilter> stream(dbg, d);
740 QMetaTypeSwitcher::switcher<void>(stream, d->type, 0);
744 const QVariant::Handler qt_kernel_variant_handler = {
748 #ifndef QT_NO_DATASTREAM
755 #if !defined(QT_NO_DEBUG_STREAM) && !defined(Q_BROKEN_DEBUG_STREAM)
762 static void dummyConstruct(QVariant::Private *, const void *) { Q_ASSERT_X(false, "QVariant", "Trying to construct an unknown type"); }
763 static void dummyClear(QVariant::Private *) { Q_ASSERT_X(false, "QVariant", "Trying to clear an unknown type"); }
764 static bool dummyIsNull(const QVariant::Private *d) { Q_ASSERT_X(false, "QVariant::isNull", "Trying to call isNull on an unknown type"); return d->is_null; }
765 static bool dummyCompare(const QVariant::Private *, const QVariant::Private *) { Q_ASSERT_X(false, "QVariant", "Trying to compare an unknown types"); return false; }
766 static bool dummyConvert(const QVariant::Private *, QVariant::Type , void *, bool *) { Q_ASSERT_X(false, "QVariant", "Trying to convert an unknown type"); return false; }
767 #if !defined(QT_NO_DEBUG_STREAM) && !defined(Q_BROKEN_DEBUG_STREAM)
768 static void dummyStreamDebug(QDebug, const QVariant &) { Q_ASSERT_X(false, "QVariant", "Trying to convert an unknown type"); }
770 const QVariant::Handler qt_dummy_variant_handler = {
774 #ifndef QT_NO_DATASTREAM
781 #if !defined(QT_NO_DEBUG_STREAM) && !defined(Q_BROKEN_DEBUG_STREAM)
788 static void customConstruct(QVariant::Private *d, const void *copy)
790 const uint size = QMetaType::sizeOf(d->type);
792 d->type = QVariant::Invalid;
796 // this logic should match with QVariantIntegrator::CanUseInternalSpace
797 if (size <= sizeof(QVariant::Private::Data)
798 && (QMetaType::typeFlags(d->type) & QMetaType::MovableType)) {
799 QMetaType::construct(d->type, &d->data.ptr, copy);
800 d->is_shared = false;
802 void *ptr = QMetaType::create(d->type, copy);
804 d->data.shared = new QVariant::PrivateShared(ptr);
808 static void customClear(QVariant::Private *d)
811 QMetaType::destruct(d->type, &d->data.ptr);
813 QMetaType::destroy(d->type, d->data.shared->ptr);
814 delete d->data.shared;
818 static bool customIsNull(const QVariant::Private *d)
823 static bool customCompare(const QVariant::Private *a, const QVariant::Private *b)
825 const char *const typeName = QMetaType::typeName(a->type);
826 if (Q_UNLIKELY(!typeName) && Q_LIKELY(!QMetaType::isRegistered(a->type)))
827 qFatal("QVariant::compare: type %d unknown to QVariant.", a->type);
829 const void *a_ptr = a->is_shared ? a->data.shared->ptr : &(a->data.ptr);
830 const void *b_ptr = b->is_shared ? b->data.shared->ptr : &(b->data.ptr);
832 uint typeNameLen = qstrlen(typeName);
833 if (typeNameLen > 0 && typeName[typeNameLen - 1] == '*')
834 return *static_cast<void *const *>(a_ptr) == *static_cast<void *const *>(b_ptr);
836 if (a->is_null && b->is_null)
839 return !memcmp(a_ptr, b_ptr, QMetaType::sizeOf(a->type));
842 static bool customConvert(const QVariant::Private *, QVariant::Type, void *, bool *ok)
849 #if !defined(QT_NO_DEBUG_STREAM) && !defined(Q_BROKEN_DEBUG_STREAM)
850 static void customStreamDebug(QDebug, const QVariant &) {}
853 const QVariant::Handler qt_custom_variant_handler = {
857 #ifndef QT_NO_DATASTREAM
864 #if !defined(QT_NO_DEBUG_STREAM) && !defined(Q_BROKEN_DEBUG_STREAM)
871 } // annonymous used to hide QVariant handlers
873 static HandlersManager handlerManager;
874 Q_STATIC_ASSERT_X(!QModulesPrivate::Core, "Initialization assumes that ModulesNames::Core is 0");
875 const QVariant::Handler *HandlersManager::Handlers[QModulesPrivate::ModulesCount]
876 = { &qt_kernel_variant_handler, &qt_dummy_variant_handler,
877 &qt_dummy_variant_handler, &qt_custom_variant_handler };
879 Q_CORE_EXPORT const QVariant::Handler *qcoreVariantHandler()
881 return &qt_kernel_variant_handler;
884 inline void HandlersManager::unregisterHandler(const QModulesPrivate::Names name)
886 Handlers[name] = &qt_dummy_variant_handler;
889 Q_CORE_EXPORT void QVariantPrivate::registerHandler(const int /* Modules::Names */name, const QVariant::Handler *handler)
891 handlerManager.registerHandler(static_cast<QModulesPrivate::Names>(name), handler);
894 Q_CORE_EXPORT void QVariantPrivate::unregisterHandler(const int /* Modules::Names */ name)
896 handlerManager.unregisterHandler(static_cast<QModulesPrivate::Names>(name));
901 \brief The QVariant class acts like a union for the most common Qt data types.
907 Because C++ forbids unions from including types that have
908 non-default constructors or destructors, most interesting Qt
909 classes cannot be used in unions. Without QVariant, this would be
910 a problem for QObject::property() and for database work, etc.
912 A QVariant object holds a single value of a single type() at a
913 time. (Some type()s are multi-valued, for example a string list.)
914 You can find out what type, T, the variant holds, convert it to a
915 different type using convert(), get its value using one of the
916 toT() functions (e.g., toSize()) and check whether the type can
917 be converted to a particular type using canConvert().
919 The methods named toT() (e.g., toInt(), toString()) are const. If
920 you ask for the stored type, they return a copy of the stored
921 object. If you ask for a type that can be generated from the
922 stored type, toT() copies and converts and leaves the object
923 itself unchanged. If you ask for a type that cannot be generated
924 from the stored type, the result depends on the type; see the
925 function documentation for details.
927 Here is some example code to demonstrate the use of QVariant:
929 \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 0
931 You can even store QList<QVariant> and QMap<QString, QVariant>
932 values in a variant, so you can easily construct arbitrarily
933 complex data structures of arbitrary types. This is very powerful
934 and versatile, but may prove less memory and speed efficient than
935 storing specific types in standard data structures.
937 QVariant also supports the notion of null values, where you can
938 have a defined type with no value set. However, note that QVariant
939 types can only be cast when they have had a value set.
941 \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 1
943 QVariant can be extended to support other types than those
944 mentioned in the \l Type enum. See the \l QMetaType documentation
947 \section1 A Note on GUI Types
949 Because QVariant is part of the QtCore library, it cannot provide
950 conversion functions to data types defined in QtGui, such as
951 QColor, QImage, and QPixmap. In other words, there is no \c
952 toColor() function. Instead, you can use the QVariant::value() or
953 the qvariant_cast() template function. For example:
955 \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 2
957 The inverse conversion (e.g., from QColor to QVariant) is
958 automatic for all data types supported by QVariant, including
961 \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 3
963 \section1 Using canConvert() and convert() Consecutively
965 When using canConvert() and convert() consecutively, it is possible for
966 canConvert() to return true, but convert() to return false. This
967 is typically because canConvert() only reports the general ability of
968 QVariant to convert between types given suitable data; it is still
969 possible to supply data which cannot actually be converted.
971 For example, canConvert() would return true when called on a variant
972 containing a string because, in principle, QVariant is able to convert
973 strings of numbers to integers.
974 However, if the string contains non-numeric characters, it cannot be
975 converted to an integer, and any attempt to convert it will fail.
976 Hence, it is important to have both functions return true for a
977 successful conversion.
985 This enum type defines the types of variable that a QVariant can
988 \value Invalid no type
989 \value BitArray a QBitArray
990 \value Bitmap a QBitmap
992 \value Brush a QBrush
993 \value ByteArray a QByteArray
995 \value Color a QColor
996 \value Cursor a QCursor
998 \value DateTime a QDateTime
999 \value Double a double
1000 \value EasingCurve a QEasingCurve
1002 \value ModelIndex a QModelIndex
1004 \value Hash a QVariantHash
1006 \value Image a QImage
1008 \value KeySequence a QKeySequence
1010 \value LineF a QLineF
1011 \value List a QVariantList
1012 \value Locale a QLocale
1013 \value LongLong a \l qlonglong
1014 \value Map a QVariantMap
1015 \value Matrix a QMatrix
1016 \value Transform a QTransform
1017 \value Matrix4x4 a QMatrix4x4
1018 \value Palette a QPalette
1020 \value Pixmap a QPixmap
1021 \value Point a QPoint
1022 \value PointF a QPointF
1023 \value Polygon a QPolygon
1024 \value PolygonF a QPolygonF
1025 \value Quaternion a QQuaternion
1027 \value RectF a QRectF
1028 \value RegExp a QRegExp
1029 \value Region a QRegion
1031 \value SizeF a QSizeF
1032 \value SizePolicy a QSizePolicy
1033 \value String a QString
1034 \value StringList a QStringList
1035 \value TextFormat a QTextFormat
1036 \value TextLength a QTextLength
1038 \value UInt a \l uint
1039 \value ULongLong a \l qulonglong
1041 \value Vector2D a QVector2D
1042 \value Vector3D a QVector3D
1043 \value Vector4D a QVector4D
1045 \value UserType Base value for user-defined types.
1048 \omitvalue ColorGroup
1050 \omitvalue LastGuiType
1051 \omitvalue LastCoreType
1056 \fn QVariant::QVariant()
1058 Constructs an invalid variant.
1063 \fn QVariant::QVariant(int typeOrUserType, const void *copy)
1065 Constructs variant of type \a typeOrUserType, and initializes with
1066 \a copy if \a copy is not 0.
1068 Note that you have to pass the address of the variable you want stored.
1070 Usually, you never have to use this constructor, use QVariant::fromValue()
1071 instead to construct variants from the pointer types represented by
1072 \c QMetaType::VoidStar, \c QMetaType::QObjectStar and
1073 \c QMetaType::QWidgetStar.
1075 \sa QVariant::fromValue(), Type
1079 \fn QVariant::QVariant(Type type)
1081 Constructs a null variant of type \a type.
1087 \fn QVariant::create(int type, const void *copy)
1091 Constructs a variant private of type \a type, and initializes with \a copy if
1095 void QVariant::create(int type, const void *copy)
1098 handlerManager[type]->construct(&d, copy);
1102 \fn QVariant::~QVariant()
1104 Destroys the QVariant and the contained object.
1106 Note that subclasses that reimplement clear() should reimplement
1107 the destructor to call clear(). This destructor calls clear(), but
1108 because it is the destructor, QVariant::clear() is called rather
1109 than a subclass's clear().
1112 QVariant::~QVariant()
1114 if ((d.is_shared && !d.data.shared->ref.deref()) || (!d.is_shared && d.type > Char))
1115 handlerManager[d.type]->clear(&d);
1119 \fn QVariant::QVariant(const QVariant &p)
1121 Constructs a copy of the variant, \a p, passed as the argument to
1125 QVariant::QVariant(const QVariant &p)
1129 d.data.shared->ref.ref();
1130 } else if (p.d.type > Char) {
1131 handlerManager[d.type]->construct(&d, p.constData());
1132 d.is_null = p.d.is_null;
1136 #ifndef QT_NO_DATASTREAM
1138 Reads the variant from the data stream, \a s.
1140 QVariant::QVariant(QDataStream &s)
1145 #endif //QT_NO_DATASTREAM
1148 \fn QVariant::QVariant(const QString &val)
1150 Constructs a new variant with a string value, \a val.
1154 \fn QVariant::QVariant(const QLatin1String &val)
1156 Constructs a new variant with a string value, \a val.
1160 \fn QVariant::QVariant(const char *val)
1162 Constructs a new variant with a string value of \a val.
1163 The variant creates a deep copy of \a val, using the encoding
1164 set by QTextCodec::setCodecForCStrings().
1166 Note that \a val is converted to a QString for storing in the
1167 variant and QVariant::type() will return QMetaType::QString for
1170 You can disable this operator by defining \c
1171 QT_NO_CAST_FROM_ASCII when you compile your applications.
1173 \sa QTextCodec::setCodecForCStrings()
1176 #ifndef QT_NO_CAST_FROM_ASCII
1177 QVariant::QVariant(const char *val)
1179 QString s = QString::fromAscii(val);
1185 \fn QVariant::QVariant(const QStringList &val)
1187 Constructs a new variant with a string list value, \a val.
1191 \fn QVariant::QVariant(const QMap<QString, QVariant> &val)
1193 Constructs a new variant with a map of QVariants, \a val.
1197 \fn QVariant::QVariant(const QHash<QString, QVariant> &val)
1199 Constructs a new variant with a hash of QVariants, \a val.
1203 \fn QVariant::QVariant(const QDate &val)
1205 Constructs a new variant with a date value, \a val.
1209 \fn QVariant::QVariant(const QTime &val)
1211 Constructs a new variant with a time value, \a val.
1215 \fn QVariant::QVariant(const QDateTime &val)
1217 Constructs a new variant with a date/time value, \a val.
1222 \fn QVariant::QVariant(const QEasingCurve &val)
1224 Constructs a new variant with an easing curve value, \a val.
1228 \fn QVariant::QVariant(const QByteArray &val)
1230 Constructs a new variant with a bytearray value, \a val.
1234 \fn QVariant::QVariant(const QBitArray &val)
1236 Constructs a new variant with a bitarray value, \a val.
1240 \fn QVariant::QVariant(const QPoint &val)
1242 Constructs a new variant with a point value of \a val.
1246 \fn QVariant::QVariant(const QPointF &val)
1248 Constructs a new variant with a point value of \a val.
1252 \fn QVariant::QVariant(const QRectF &val)
1254 Constructs a new variant with a rect value of \a val.
1258 \fn QVariant::QVariant(const QLineF &val)
1260 Constructs a new variant with a line value of \a val.
1264 \fn QVariant::QVariant(const QLine &val)
1266 Constructs a new variant with a line value of \a val.
1270 \fn QVariant::QVariant(const QRect &val)
1272 Constructs a new variant with a rect value of \a val.
1276 \fn QVariant::QVariant(const QSize &val)
1278 Constructs a new variant with a size value of \a val.
1282 \fn QVariant::QVariant(const QSizeF &val)
1284 Constructs a new variant with a size value of \a val.
1288 \fn QVariant::QVariant(const QUrl &val)
1290 Constructs a new variant with a url value of \a val.
1294 \fn QVariant::QVariant(int val)
1296 Constructs a new variant with an integer value, \a val.
1300 \fn QVariant::QVariant(uint val)
1302 Constructs a new variant with an unsigned integer value, \a val.
1306 \fn QVariant::QVariant(qlonglong val)
1308 Constructs a new variant with a long long integer value, \a val.
1312 \fn QVariant::QVariant(qulonglong val)
1314 Constructs a new variant with an unsigned long long integer value, \a val.
1319 \fn QVariant::QVariant(bool val)
1321 Constructs a new variant with a boolean value, \a val.
1325 \fn QVariant::QVariant(double val)
1327 Constructs a new variant with a floating point value, \a val.
1331 \fn QVariant::QVariant(float val)
1333 Constructs a new variant with a floating point value, \a val.
1338 \fn QVariant::QVariant(const QList<QVariant> &val)
1340 Constructs a new variant with a list value, \a val.
1344 \fn QVariant::QVariant(const QChar &c)
1346 Constructs a new variant with a char value, \a c.
1350 \fn QVariant::QVariant(const QLocale &l)
1352 Constructs a new variant with a locale value, \a l.
1356 \fn QVariant::QVariant(const QRegExp ®Exp)
1358 Constructs a new variant with the regexp value \a regExp.
1362 \fn QVariant::QVariant(Qt::GlobalColor color)
1364 Constructs a new variant of type QVariant::Color and initializes
1367 This is a convenience constructor that allows \c{QVariant(Qt::blue);}
1368 to create a valid QVariant storing a QColor.
1370 Note: This constructor will assert if the application does not link
1371 to the Qt GUI library.
1374 QVariant::QVariant(Type type)
1375 { create(type, 0); }
1376 QVariant::QVariant(int typeOrUserType, const void *copy)
1377 { create(typeOrUserType, copy); d.is_null = false; }
1380 flags is true if it is a pointer type
1382 QVariant::QVariant(int typeOrUserType, const void *copy, uint flags)
1384 if (flags) { //type is a pointer type
1385 d.type = typeOrUserType;
1386 d.data.ptr = *reinterpret_cast<void *const*>(copy);
1388 create(typeOrUserType, copy);
1393 QVariant::QVariant(int val)
1394 { d.is_null = false; d.type = Int; d.data.i = val; }
1395 QVariant::QVariant(uint val)
1396 { d.is_null = false; d.type = UInt; d.data.u = val; }
1397 QVariant::QVariant(qlonglong val)
1398 { d.is_null = false; d.type = LongLong; d.data.ll = val; }
1399 QVariant::QVariant(qulonglong val)
1400 { d.is_null = false; d.type = ULongLong; d.data.ull = val; }
1401 QVariant::QVariant(bool val)
1402 { d.is_null = false; d.type = Bool; d.data.b = val; }
1403 QVariant::QVariant(double val)
1404 { d.is_null = false; d.type = Double; d.data.d = val; }
1406 QVariant::QVariant(const QByteArray &val)
1407 { d.is_null = false; d.type = ByteArray; v_construct<QByteArray>(&d, val); }
1408 QVariant::QVariant(const QBitArray &val)
1409 { d.is_null = false; d.type = BitArray; v_construct<QBitArray>(&d, val); }
1410 QVariant::QVariant(const QString &val)
1411 { d.is_null = false; d.type = String; v_construct<QString>(&d, val); }
1412 QVariant::QVariant(const QChar &val)
1413 { d.is_null = false; d.type = Char; v_construct<QChar>(&d, val); }
1414 QVariant::QVariant(const QLatin1String &val)
1415 { QString str(val); d.is_null = false; d.type = String; v_construct<QString>(&d, str); }
1416 QVariant::QVariant(const QStringList &val)
1417 { d.is_null = false; d.type = StringList; v_construct<QStringList>(&d, val); }
1419 QVariant::QVariant(const QDate &val)
1420 { d.is_null = false; d.type = Date; v_construct<QDate>(&d, val); }
1421 QVariant::QVariant(const QTime &val)
1422 { d.is_null = false; d.type = Time; v_construct<QTime>(&d, val); }
1423 QVariant::QVariant(const QDateTime &val)
1424 { d.is_null = false; d.type = DateTime; v_construct<QDateTime>(&d, val); }
1425 #ifndef QT_BOOTSTRAPPED
1426 QVariant::QVariant(const QEasingCurve &val)
1427 { d.is_null = false; d.type = EasingCurve; v_construct<QEasingCurve>(&d, val); }
1429 QVariant::QVariant(const QList<QVariant> &list)
1430 { d.is_null = false; d.type = List; v_construct<QVariantList>(&d, list); }
1431 QVariant::QVariant(const QMap<QString, QVariant> &map)
1432 { d.is_null = false; d.type = Map; v_construct<QVariantMap>(&d, map); }
1433 QVariant::QVariant(const QHash<QString, QVariant> &hash)
1434 { d.is_null = false; d.type = Hash; v_construct<QVariantHash>(&d, hash); }
1435 #ifndef QT_NO_GEOM_VARIANT
1436 QVariant::QVariant(const QPoint &pt) { d.is_null = false; d.type = Point; v_construct<QPoint>(&d, pt); }
1437 QVariant::QVariant(const QPointF &pt) { d.is_null = false; d.type = PointF; v_construct<QPointF>(&d, pt); }
1438 QVariant::QVariant(const QRectF &r) { d.is_null = false; d.type = RectF; v_construct<QRectF>(&d, r); }
1439 QVariant::QVariant(const QLineF &l) { d.is_null = false; d.type = LineF; v_construct<QLineF>(&d, l); }
1440 QVariant::QVariant(const QLine &l) { d.is_null = false; d.type = Line; v_construct<QLine>(&d, l); }
1441 QVariant::QVariant(const QRect &r) { d.is_null = false; d.type = Rect; v_construct<QRect>(&d, r); }
1442 QVariant::QVariant(const QSize &s) { d.is_null = false; d.type = Size; v_construct<QSize>(&d, s); }
1443 QVariant::QVariant(const QSizeF &s) { d.is_null = false; d.type = SizeF; v_construct<QSizeF>(&d, s); }
1445 QVariant::QVariant(const QUrl &u) { d.is_null = false; d.type = Url; v_construct<QUrl>(&d, u); }
1446 QVariant::QVariant(const QLocale &l) { d.is_null = false; d.type = Locale; v_construct<QLocale>(&d, l); }
1447 #ifndef QT_NO_REGEXP
1448 QVariant::QVariant(const QRegExp ®Exp) { d.is_null = false; d.type = RegExp; v_construct<QRegExp>(&d, regExp); }
1450 QVariant::QVariant(Qt::GlobalColor color) { create(62, &color); }
1453 Returns the storage type of the value stored in the variant.
1454 Although this function is declared as returning QVariant::Type,
1455 the return value should be interpreted as QMetaType::Type. In
1456 particular, QVariant::UserType is returned here only if the value
1457 is equal or greater than QMetaType::User.
1459 Note that return values in the ranges QVariant::Char through
1460 QVariant::RegExp and QVariant::Font through QVariant::Transform
1461 correspond to the values in the ranges QMetaType::QChar through
1462 QMetaType::QRegExp and QMetaType::QFont through QMetaType::QQuaternion.
1464 Pay particular attention when working with char and QChar
1465 variants. Note that there is no QVariant constructor specifically
1466 for type char, but there is one for QChar. For a variant of type
1467 QChar, this function returns QVariant::Char, which is the same as
1468 QMetaType::QChar, but for a variant of type \c char, this function
1469 returns QMetaType::Char, which is \e not the same as
1472 Also note that the types \c void*, \c long, \c short, \c unsigned
1473 \c long, \c unsigned \c short, \c unsigned \c char, \c float, \c
1474 QObject*, and \c QWidget* are represented in QMetaType::Type but
1475 not in QVariant::Type, and they can be returned by this function.
1476 However, they are considered to be user defined types when tested
1477 against QVariant::Type.
1479 To test whether an instance of QVariant contains a data type that
1480 is compatible with the data type you are interested in, use
1484 QVariant::Type QVariant::type() const
1486 return d.type >= QMetaType::User ? UserType : static_cast<Type>(d.type);
1490 Returns the storage type of the value stored in the variant. For
1491 non-user types, this is the same as type().
1496 int QVariant::userType() const
1502 Assigns the value of the variant \a variant to this variant.
1504 QVariant& QVariant::operator=(const QVariant &variant)
1506 if (this == &variant)
1510 if (variant.d.is_shared) {
1511 variant.d.data.shared->ref.ref();
1513 } else if (variant.d.type > Char) {
1514 d.type = variant.d.type;
1515 handlerManager[d.type]->construct(&d, variant.constData());
1516 d.is_null = variant.d.is_null;
1525 \fn void QVariant::swap(QVariant &other)
1528 Swaps variant \a other with this variant. This operation is very
1529 fast and never fails.
1533 \fn void QVariant::detach()
1538 void QVariant::detach()
1540 if (!d.is_shared || d.data.shared->ref.load() == 1)
1545 handlerManager[d.type]->construct(&dd, constData());
1546 if (!d.data.shared->ref.deref())
1547 handlerManager[d.type]->clear(&d);
1548 d.data.shared = dd.data.shared;
1552 \fn bool QVariant::isDetached() const
1557 // ### Qt 5: change typeName()(and froends= to return a QString. Suggestion from Harald.
1559 Returns the name of the type stored in the variant. The returned
1560 strings describe the C++ datatype used to store the data: for
1561 example, "QFont", "QString", or "QVariantList". An Invalid
1564 const char *QVariant::typeName() const
1566 return typeToName(Type(d.type));
1570 Convert this variant to type Invalid and free up any resources
1573 void QVariant::clear()
1575 if ((d.is_shared && !d.data.shared->ref.deref()) || (!d.is_shared && d.type > Char))
1576 handlerManager[d.type]->clear(&d);
1579 d.is_shared = false;
1583 Converts the enum representation of the storage type, \a typ, to
1584 its string representation.
1586 Returns a null pointer if the type is QVariant::Invalid or doesn't exist.
1588 const char *QVariant::typeToName(Type typ)
1592 if (typ == UserType)
1595 return QMetaType::typeName(typ);
1600 Converts the string representation of the storage type given in \a
1601 name, to its enum representation.
1603 If the string representation cannot be converted to any enum
1604 representation, the variant is set to \c Invalid.
1606 QVariant::Type QVariant::nameToType(const char *name)
1608 if (!name || !*name)
1610 if (strcmp(name, "Q3CString") == 0)
1612 if (strcmp(name, "Q_LLONG") == 0)
1614 if (strcmp(name, "Q_ULLONG") == 0)
1616 if (strcmp(name, "QIconSet") == 0)
1618 if (strcmp(name, "UserType") == 0)
1621 int metaType = QMetaType::type(name);
1622 return metaType <= int(LastGuiType) ? QVariant::Type(metaType) : UserType;
1625 #ifndef QT_NO_DATASTREAM
1626 enum { MapFromThreeCount = 36 };
1627 static const ushort map_from_three[MapFromThreeCount] =
1633 QVariant::StringList,
1649 QVariant::ByteArray,
1654 QVariant::SizePolicy,
1658 QVariant::ByteArray,
1660 QVariant::KeySequence,
1663 QVariant::ULongLong,
1664 QVariant::EasingCurve
1668 Internal function for loading a variant from stream \a s. Use the
1669 stream operators instead.
1673 void QVariant::load(QDataStream &s)
1679 if (s.version() < QDataStream::Qt_4_0) {
1680 if (u >= MapFromThreeCount)
1682 u = map_from_three[u];
1684 qint8 is_null = false;
1685 if (s.version() >= QDataStream::Qt_4_2)
1687 if (u == QVariant::UserType) {
1690 u = QMetaType::type(name);
1692 s.setStatus(QDataStream::ReadCorruptData);
1696 create(static_cast<int>(u), 0);
1697 d.is_null = is_null;
1700 // Since we wrote something, we should read something
1707 // const cast is safe since we operate on a newly constructed variant
1708 if (!QMetaType::load(s, d.type, const_cast<void *>(constData()))) {
1709 s.setStatus(QDataStream::ReadCorruptData);
1710 qWarning("QVariant::load: unable to load type %d.", d.type);
1715 Internal function for saving a variant to the stream \a s. Use the
1716 stream operators instead.
1720 void QVariant::save(QDataStream &s) const
1722 quint32 tp = type();
1723 if (s.version() < QDataStream::Qt_4_0) {
1725 for (i = MapFromThreeCount - 1; i >= 0; i--) {
1726 if (map_from_three[i] == tp) {
1737 if (s.version() >= QDataStream::Qt_4_2)
1738 s << qint8(d.is_null);
1739 if (tp == QVariant::UserType) {
1740 s << QMetaType::typeName(userType());
1748 if (!QMetaType::save(s, d.type, constData())) {
1749 Q_ASSERT_X(false, "QVariant::save", "Invalid type to save");
1750 qWarning("QVariant::save: unable to save type %d.", d.type);
1757 Reads a variant \a p from the stream \a s.
1759 \sa \link datastreamformat.html Format of the QDataStream
1762 QDataStream& operator>>(QDataStream &s, QVariant &p)
1769 Writes a variant \a p to the stream \a s.
1771 \sa \link datastreamformat.html Format of the QDataStream
1774 QDataStream& operator<<(QDataStream &s, const QVariant &p)
1781 Reads a variant type \a p in enum representation from the stream \a s.
1783 QDataStream& operator>>(QDataStream &s, QVariant::Type &p)
1787 p = (QVariant::Type)u;
1793 Writes a variant type \a p to the stream \a s.
1795 QDataStream& operator<<(QDataStream &s, const QVariant::Type p)
1797 s << static_cast<quint32>(p);
1802 #endif //QT_NO_DATASTREAM
1805 \fn bool QVariant::isValid() const
1807 Returns true if the storage type of this variant is not
1808 QVariant::Invalid; otherwise returns false.
1811 template <typename T>
1812 inline T qVariantToHelper(const QVariant::Private &d, const HandlersManager &handlerManager)
1814 const QVariant::Type targetType = static_cast<const QVariant::Type>(qMetaTypeId<T>());
1815 if (d.type == targetType)
1816 return *v_cast<T>(&d);
1819 handlerManager[d.type]->convert(&d, targetType, &ret, 0);
1824 \fn QStringList QVariant::toStringList() const
1826 Returns the variant as a QStringList if the variant has type()
1827 StringList, \l String, or \l List of a type that can be converted
1828 to QString; otherwise returns an empty list.
1830 \sa canConvert(), convert()
1832 QStringList QVariant::toStringList() const
1834 return qVariantToHelper<QStringList>(d, handlerManager);
1838 Returns the variant as a QString if the variant has type() \l
1839 String, \l Bool, \l ByteArray, \l Char, \l Date, \l DateTime, \l
1840 Double, \l Int, \l LongLong, \l StringList, \l Time, \l UInt, or
1841 \l ULongLong; otherwise returns an empty string.
1843 \sa canConvert(), convert()
1845 QString QVariant::toString() const
1847 return qVariantToHelper<QString>(d, handlerManager);
1851 Returns the variant as a QMap<QString, QVariant> if the variant
1852 has type() \l Map; otherwise returns an empty map.
1854 \sa canConvert(), convert()
1856 QVariantMap QVariant::toMap() const
1858 return qVariantToHelper<QVariantMap>(d, handlerManager);
1862 Returns the variant as a QHash<QString, QVariant> if the variant
1863 has type() \l Hash; otherwise returns an empty map.
1865 \sa canConvert(), convert()
1867 QVariantHash QVariant::toHash() const
1869 return qVariantToHelper<QVariantHash>(d, handlerManager);
1873 \fn QDate QVariant::toDate() const
1875 Returns the variant as a QDate if the variant has type() \l Date,
1876 \l DateTime, or \l String; otherwise returns an invalid date.
1878 If the type() is \l String, an invalid date will be returned if the
1879 string cannot be parsed as a Qt::ISODate format date.
1881 \sa canConvert(), convert()
1883 QDate QVariant::toDate() const
1885 return qVariantToHelper<QDate>(d, handlerManager);
1889 \fn QTime QVariant::toTime() const
1891 Returns the variant as a QTime if the variant has type() \l Time,
1892 \l DateTime, or \l String; otherwise returns an invalid time.
1894 If the type() is \l String, an invalid time will be returned if
1895 the string cannot be parsed as a Qt::ISODate format time.
1897 \sa canConvert(), convert()
1899 QTime QVariant::toTime() const
1901 return qVariantToHelper<QTime>(d, handlerManager);
1905 \fn QDateTime QVariant::toDateTime() const
1907 Returns the variant as a QDateTime if the variant has type() \l
1908 DateTime, \l Date, or \l String; otherwise returns an invalid
1911 If the type() is \l String, an invalid date/time will be returned
1912 if the string cannot be parsed as a Qt::ISODate format date/time.
1914 \sa canConvert(), convert()
1916 QDateTime QVariant::toDateTime() const
1918 return qVariantToHelper<QDateTime>(d, handlerManager);
1923 \fn QEasingCurve QVariant::toEasingCurve() const
1925 Returns the variant as a QEasingCurve if the variant has type() \l
1926 EasingCurve; otherwise returns a default easing curve.
1928 \sa canConvert(), convert()
1930 #ifndef QT_BOOTSTRAPPED
1931 QEasingCurve QVariant::toEasingCurve() const
1933 return qVariantToHelper<QEasingCurve>(d, handlerManager);
1938 \fn QByteArray QVariant::toByteArray() const
1940 Returns the variant as a QByteArray if the variant has type() \l
1941 ByteArray or \l String (converted using QString::fromAscii());
1942 otherwise returns an empty byte array.
1944 \sa canConvert(), convert()
1946 QByteArray QVariant::toByteArray() const
1948 return qVariantToHelper<QByteArray>(d, handlerManager);
1951 #ifndef QT_NO_GEOM_VARIANT
1953 \fn QPoint QVariant::toPoint() const
1955 Returns the variant as a QPoint if the variant has type()
1956 \l Point or \l PointF; otherwise returns a null QPoint.
1958 \sa canConvert(), convert()
1960 QPoint QVariant::toPoint() const
1962 return qVariantToHelper<QPoint>(d, handlerManager);
1966 \fn QRect QVariant::toRect() const
1968 Returns the variant as a QRect if the variant has type() \l Rect;
1969 otherwise returns an invalid QRect.
1971 \sa canConvert(), convert()
1973 QRect QVariant::toRect() const
1975 return qVariantToHelper<QRect>(d, handlerManager);
1979 \fn QSize QVariant::toSize() const
1981 Returns the variant as a QSize if the variant has type() \l Size;
1982 otherwise returns an invalid QSize.
1984 \sa canConvert(), convert()
1986 QSize QVariant::toSize() const
1988 return qVariantToHelper<QSize>(d, handlerManager);
1992 \fn QSizeF QVariant::toSizeF() const
1994 Returns the variant as a QSizeF if the variant has type() \l
1995 SizeF; otherwise returns an invalid QSizeF.
1997 \sa canConvert(), convert()
1999 QSizeF QVariant::toSizeF() const
2001 return qVariantToHelper<QSizeF>(d, handlerManager);
2005 \fn QRectF QVariant::toRectF() const
2007 Returns the variant as a QRectF if the variant has type() \l Rect
2008 or \l RectF; otherwise returns an invalid QRectF.
2010 \sa canConvert(), convert()
2012 QRectF QVariant::toRectF() const
2014 return qVariantToHelper<QRectF>(d, handlerManager);
2018 \fn QLineF QVariant::toLineF() const
2020 Returns the variant as a QLineF if the variant has type() \l
2021 LineF; otherwise returns an invalid QLineF.
2023 \sa canConvert(), convert()
2025 QLineF QVariant::toLineF() const
2027 return qVariantToHelper<QLineF>(d, handlerManager);
2031 \fn QLine QVariant::toLine() const
2033 Returns the variant as a QLine if the variant has type() \l Line;
2034 otherwise returns an invalid QLine.
2036 \sa canConvert(), convert()
2038 QLine QVariant::toLine() const
2040 return qVariantToHelper<QLine>(d, handlerManager);
2044 \fn QPointF QVariant::toPointF() const
2046 Returns the variant as a QPointF if the variant has type() \l
2047 Point or \l PointF; otherwise returns a null QPointF.
2049 \sa canConvert(), convert()
2051 QPointF QVariant::toPointF() const
2053 return qVariantToHelper<QPointF>(d, handlerManager);
2056 #endif // QT_NO_GEOM_VARIANT
2059 \fn QUrl QVariant::toUrl() const
2061 Returns the variant as a QUrl if the variant has type()
2062 \l Url; otherwise returns an invalid QUrl.
2064 \sa canConvert(), convert()
2066 QUrl QVariant::toUrl() const
2068 return qVariantToHelper<QUrl>(d, handlerManager);
2072 \fn QLocale QVariant::toLocale() const
2074 Returns the variant as a QLocale if the variant has type()
2075 \l Locale; otherwise returns an invalid QLocale.
2077 \sa canConvert(), convert()
2079 QLocale QVariant::toLocale() const
2081 return qVariantToHelper<QLocale>(d, handlerManager);
2085 \fn QRegExp QVariant::toRegExp() const
2088 Returns the variant as a QRegExp if the variant has type() \l
2089 RegExp; otherwise returns an empty QRegExp.
2091 \sa canConvert(), convert()
2093 #ifndef QT_NO_REGEXP
2094 QRegExp QVariant::toRegExp() const
2096 return qVariantToHelper<QRegExp>(d, handlerManager);
2101 \fn QChar QVariant::toChar() const
2103 Returns the variant as a QChar if the variant has type() \l Char,
2104 \l Int, or \l UInt; otherwise returns an invalid QChar.
2106 \sa canConvert(), convert()
2108 QChar QVariant::toChar() const
2110 return qVariantToHelper<QChar>(d, handlerManager);
2114 Returns the variant as a QBitArray if the variant has type()
2115 \l BitArray; otherwise returns an empty bit array.
2117 \sa canConvert(), convert()
2119 QBitArray QVariant::toBitArray() const
2121 return qVariantToHelper<QBitArray>(d, handlerManager);
2124 template <typename T>
2125 inline T qNumVariantToHelper(const QVariant::Private &d,
2126 const HandlersManager &handlerManager, bool *ok, const T& val)
2128 uint t = qMetaTypeId<T>();
2135 if (!handlerManager[d.type]->convert(&d, QVariant::Type(t), &ret, ok) && ok)
2141 Returns the variant as an int if the variant has type() \l Int,
2142 \l Bool, \l ByteArray, \l Char, \l Double, \l LongLong, \l
2143 String, \l UInt, or \l ULongLong; otherwise returns 0.
2145 If \a ok is non-null: \c{*}\a{ok} is set to true if the value could be
2146 converted to an int; otherwise \c{*}\a{ok} is set to false.
2148 \bold{Warning:} If the value is convertible to a \l LongLong but is too
2149 large to be represented in an int, the resulting arithmetic overflow will
2150 not be reflected in \a ok. A simple workaround is to use QString::toInt().
2151 Fixing this bug has been postponed to Qt 5 in order to avoid breaking existing code.
2153 \sa canConvert(), convert()
2155 int QVariant::toInt(bool *ok) const
2157 return qNumVariantToHelper<int>(d, handlerManager, ok, d.data.i);
2161 Returns the variant as an unsigned int if the variant has type()
2162 \l UInt, \l Bool, \l ByteArray, \l Char, \l Double, \l Int, \l
2163 LongLong, \l String, or \l ULongLong; otherwise returns 0.
2165 If \a ok is non-null: \c{*}\a{ok} is set to true if the value could be
2166 converted to an unsigned int; otherwise \c{*}\a{ok} is set to false.
2168 \bold{Warning:} If the value is convertible to a \l ULongLong but is too
2169 large to be represented in an unsigned int, the resulting arithmetic overflow will
2170 not be reflected in \a ok. A simple workaround is to use QString::toUInt().
2171 Fixing this bug has been postponed to Qt 5 in order to avoid breaking existing code.
2173 \sa canConvert(), convert()
2175 uint QVariant::toUInt(bool *ok) const
2177 return qNumVariantToHelper<uint>(d, handlerManager, ok, d.data.u);
2181 Returns the variant as a long long int if the variant has type()
2182 \l LongLong, \l Bool, \l ByteArray, \l Char, \l Double, \l Int,
2183 \l String, \l UInt, or \l ULongLong; otherwise returns 0.
2185 If \a ok is non-null: \c{*}\c{ok} is set to true if the value could be
2186 converted to an int; otherwise \c{*}\c{ok} is set to false.
2188 \sa canConvert(), convert()
2190 qlonglong QVariant::toLongLong(bool *ok) const
2192 return qNumVariantToHelper<qlonglong>(d, handlerManager, ok, d.data.ll);
2196 Returns the variant as as an unsigned long long int if the
2197 variant has type() \l ULongLong, \l Bool, \l ByteArray, \l Char,
2198 \l Double, \l Int, \l LongLong, \l String, or \l UInt; otherwise
2201 If \a ok is non-null: \c{*}\a{ok} is set to true if the value could be
2202 converted to an int; otherwise \c{*}\a{ok} is set to false.
2204 \sa canConvert(), convert()
2206 qulonglong QVariant::toULongLong(bool *ok) const
2208 return qNumVariantToHelper<qulonglong>(d, handlerManager, ok, d.data.ull);
2212 Returns the variant as a bool if the variant has type() Bool.
2214 Returns true if the variant has type() \l Bool, \l Char, \l Double,
2215 \l Int, \l LongLong, \l UInt, or \l ULongLong and the value is
2216 non-zero, or if the variant has type \l String or \l ByteArray and
2217 its lower-case content is not empty, "0" or "false"; otherwise
2220 \sa canConvert(), convert()
2222 bool QVariant::toBool() const
2228 handlerManager[d.type]->convert(&d, Bool, &res, 0);
2234 Returns the variant as a double if the variant has type() \l
2235 Double, \l QMetaType::Float, \l Bool, \l ByteArray, \l Int, \l LongLong, \l String, \l
2236 UInt, or \l ULongLong; otherwise returns 0.0.
2238 If \a ok is non-null: \c{*}\a{ok} is set to true if the value could be
2239 converted to a double; otherwise \c{*}\a{ok} is set to false.
2241 \sa canConvert(), convert()
2243 double QVariant::toDouble(bool *ok) const
2245 return qNumVariantToHelper<double>(d, handlerManager, ok, d.data.d);
2249 Returns the variant as a float if the variant has type() \l
2250 Double, \l QMetaType::Float, \l Bool, \l ByteArray, \l Int, \l LongLong, \l String, \l
2251 UInt, or \l ULongLong; otherwise returns 0.0.
2255 If \a ok is non-null: \c{*}\a{ok} is set to true if the value could be
2256 converted to a double; otherwise \c{*}\a{ok} is set to false.
2258 \sa canConvert(), convert()
2260 float QVariant::toFloat(bool *ok) const
2262 return qNumVariantToHelper<float>(d, handlerManager, ok, d.data.f);
2266 Returns the variant as a qreal if the variant has type() \l
2267 Double, \l QMetaType::Float, \l Bool, \l ByteArray, \l Int, \l LongLong, \l String, \l
2268 UInt, or \l ULongLong; otherwise returns 0.0.
2272 If \a ok is non-null: \c{*}\a{ok} is set to true if the value could be
2273 converted to a double; otherwise \c{*}\a{ok} is set to false.
2275 \sa canConvert(), convert()
2277 qreal QVariant::toReal(bool *ok) const
2279 return qNumVariantToHelper<qreal>(d, handlerManager, ok, d.data.real);
2283 Returns the variant as a QVariantList if the variant has type()
2284 \l List or \l StringList; otherwise returns an empty list.
2286 \sa canConvert(), convert()
2288 QVariantList QVariant::toList() const
2290 return qVariantToHelper<QVariantList>(d, handlerManager);
2294 static const quint32 qCanConvertMatrix[QVariant::LastCoreType + 1] =
2298 /*Bool*/ 1 << QVariant::Double | 1 << QVariant::Int | 1 << QVariant::UInt
2299 | 1 << QVariant::LongLong | 1 << QVariant::ULongLong | 1 << QVariant::ByteArray
2300 | 1 << QVariant::String | 1 << QVariant::Char,
2302 /*Int*/ 1 << QVariant::UInt | 1 << QVariant::String | 1 << QVariant::Double
2303 | 1 << QVariant::Bool | 1 << QVariant::LongLong | 1 << QVariant::ULongLong
2304 | 1 << QVariant::Char | 1 << QVariant::ByteArray,
2306 /*UInt*/ 1 << QVariant::Int | 1 << QVariant::String | 1 << QVariant::Double
2307 | 1 << QVariant::Bool | 1 << QVariant::LongLong | 1 << QVariant::ULongLong
2308 | 1 << QVariant::Char | 1 << QVariant::ByteArray,
2310 /*LLong*/ 1 << QVariant::Int | 1 << QVariant::String | 1 << QVariant::Double
2311 | 1 << QVariant::Bool | 1 << QVariant::UInt | 1 << QVariant::ULongLong
2312 | 1 << QVariant::Char | 1 << QVariant::ByteArray,
2314 /*ULlong*/ 1 << QVariant::Int | 1 << QVariant::String | 1 << QVariant::Double
2315 | 1 << QVariant::Bool | 1 << QVariant::UInt | 1 << QVariant::LongLong
2316 | 1 << QVariant::Char | 1 << QVariant::ByteArray,
2318 /*double*/ 1 << QVariant::Int | 1 << QVariant::String | 1 << QVariant::ULongLong
2319 | 1 << QVariant::Bool | 1 << QVariant::UInt | 1 << QVariant::LongLong
2320 | 1 << QVariant::ByteArray,
2322 /*QChar*/ 1 << QVariant::Int | 1 << QVariant::UInt | 1 << QVariant::LongLong
2323 | 1 << QVariant::ULongLong,
2327 /*QList*/ 1 << QVariant::StringList,
2329 /*QString*/ 1 << QVariant::StringList | 1 << QVariant::ByteArray | 1 << QVariant::Int
2330 | 1 << QVariant::UInt | 1 << QVariant::Bool | 1 << QVariant::Double
2331 | 1 << QVariant::Date | 1 << QVariant::Time | 1 << QVariant::DateTime
2332 | 1 << QVariant::LongLong | 1 << QVariant::ULongLong | 1 << QVariant::Char
2333 | 1 << QVariant::Url | 1 << QVariant::Uuid,
2335 /*QStringList*/ 1 << QVariant::List | 1 << QVariant::String,
2337 /*QByteArray*/ 1 << QVariant::String | 1 << QVariant::Int | 1 << QVariant::UInt | 1 << QVariant::Bool
2338 | 1 << QVariant::Double | 1 << QVariant::LongLong | 1 << QVariant::ULongLong,
2342 /*QDate*/ 1 << QVariant::String | 1 << QVariant::DateTime,
2344 /*QTime*/ 1 << QVariant::String | 1 << QVariant::DateTime,
2346 /*QDateTime*/ 1 << QVariant::String | 1 << QVariant::Date,
2348 /*QUrl*/ 1 << QVariant::String,
2352 /*QRect*/ 1 << QVariant::RectF,
2354 /*QRectF*/ 1 << QVariant::Rect,
2356 /*QSize*/ 1 << QVariant::SizeF,
2358 /*QSizeF*/ 1 << QVariant::Size,
2360 /*QLine*/ 1 << QVariant::LineF,
2362 /*QLineF*/ 1 << QVariant::Line,
2364 /*QPoint*/ 1 << QVariant::PointF,
2366 /*QPointF*/ 1 << QVariant::Point,
2374 /*QUuid*/ 1 << QVariant::String
2378 Returns true if the variant's type can be cast to the requested
2379 type, \a t. Such casting is done automatically when calling the
2380 toInt(), toBool(), ... methods.
2382 The following casts are done automatically:
2385 \header \o Type \o Automatically Cast To
2386 \row \o \l Bool \o \l Char, \l Double, \l Int, \l LongLong, \l String, \l UInt, \l ULongLong
2387 \row \o \l ByteArray \o \l Double, \l Int, \l LongLong, \l String, \l UInt, \l ULongLong
2388 \row \o \l Char \o \l Bool, \l Int, \l UInt, \l LongLong, \l ULongLong
2389 \row \o \l Color \o \l String
2390 \row \o \l Date \o \l DateTime, \l String
2391 \row \o \l DateTime \o \l Date, \l String, \l Time
2392 \row \o \l Double \o \l Bool, \l Int, \l LongLong, \l String, \l UInt, \l ULongLong
2393 \row \o \l Font \o \l String
2394 \row \o \l Int \o \l Bool, \l Char, \l Double, \l LongLong, \l String, \l UInt, \l ULongLong
2395 \row \o \l KeySequence \o \l Int, \l String
2396 \row \o \l List \o \l StringList (if the list's items can be converted to strings)
2397 \row \o \l LongLong \o \l Bool, \l ByteArray, \l Char, \l Double, \l Int, \l String, \l UInt, \l ULongLong
2398 \row \o \l Point \o PointF
2399 \row \o \l Rect \o RectF
2400 \row \o \l String \o \l Bool, \l ByteArray, \l Char, \l Color, \l Date, \l DateTime, \l Double,
2401 \l Font, \l Int, \l KeySequence, \l LongLong, \l StringList, \l Time, \l UInt,
2403 \row \o \l StringList \o \l List, \l String (if the list contains exactly one item)
2404 \row \o \l Time \o \l String
2405 \row \o \l UInt \o \l Bool, \l Char, \l Double, \l Int, \l LongLong, \l String, \l ULongLong
2406 \row \o \l ULongLong \o \l Bool, \l Char, \l Double, \l Int, \l LongLong, \l String, \l UInt
2411 bool QVariant::canConvert(Type t) const
2413 //we can treat floats as double
2414 //the reason for not doing it the "proper" way is that QMetaType::Float's value is 135,
2415 //which can't be handled by qCanConvertMatrix
2416 //In addition QVariant::Type doesn't have a Float value, so we're using QMetaType::Float
2417 const uint currentType = ((d.type == QMetaType::Float) ? QVariant::Double : d.type);
2418 if (uint(t) == uint(QMetaType::Float)) t = QVariant::Double;
2420 if (currentType == uint(t))
2423 if (currentType > QVariant::LastCoreType || t > QVariant::LastCoreType) {
2426 return currentType == QVariant::KeySequence
2427 || currentType == QMetaType::ULong
2428 || currentType == QMetaType::Long
2429 || currentType == QMetaType::UShort
2430 || currentType == QMetaType::UChar
2431 || currentType == QMetaType::Char
2432 || currentType == QMetaType::Short;
2433 case QVariant::Image:
2434 return currentType == QVariant::Pixmap || currentType == QVariant::Bitmap;
2435 case QVariant::Pixmap:
2436 return currentType == QVariant::Image || currentType == QVariant::Bitmap
2437 || currentType == QVariant::Brush;
2438 case QVariant::Bitmap:
2439 return currentType == QVariant::Pixmap || currentType == QVariant::Image;
2440 case QVariant::ByteArray:
2441 return currentType == QVariant::Color;
2442 case QVariant::String:
2443 return currentType == QVariant::KeySequence || currentType == QVariant::Font
2444 || currentType == QVariant::Color;
2445 case QVariant::KeySequence:
2446 return currentType == QVariant::String || currentType == QVariant::Int;
2447 case QVariant::Font:
2448 return currentType == QVariant::String;
2449 case QVariant::Color:
2450 return currentType == QVariant::String || currentType == QVariant::ByteArray
2451 || currentType == QVariant::Brush;
2452 case QVariant::Brush:
2453 return currentType == QVariant::Color || currentType == QVariant::Pixmap;
2454 case QMetaType::Long:
2455 case QMetaType::Char:
2456 case QMetaType::UChar:
2457 case QMetaType::ULong:
2458 case QMetaType::Short:
2459 case QMetaType::UShort:
2460 return qCanConvertMatrix[QVariant::Int] & (1 << currentType) || currentType == QVariant::Int;
2466 if(t == String && currentType == StringList)
2467 return v_cast<QStringList>(&d)->count() == 1;
2469 return qCanConvertMatrix[t] & (1 << currentType);
2473 Casts the variant to the requested type, \a t. If the cast cannot be
2474 done, the variant is cleared. Returns true if the current type of
2475 the variant was successfully cast; otherwise returns false.
2477 \warning For historical reasons, converting a null QVariant results
2478 in a null value of the desired type (e.g., an empty string for
2479 QString) and a result of false.
2481 \sa canConvert(), clear()
2484 bool QVariant::convert(Type t)
2486 if (d.type == uint(t))
2489 QVariant oldValue = *this;
2492 if (!oldValue.canConvert(t))
2496 if (oldValue.isNull())
2500 if (!handlerManager[d.type]->convert(&oldValue.d, t, data(), &isOk))
2507 \fn convert(const int type, void *ptr) const
2509 Created for qvariant_cast() usage
2511 bool QVariant::convert(const int type, void *ptr) const
2513 Q_ASSERT(type < int(QMetaType::User));
2514 return handlerManager[type]->convert(&d, QVariant::Type(type), ptr, 0);
2519 \fn bool operator==(const QVariant &v1, const QVariant &v2)
2523 Returns true if \a v1 and \a v2 are equal; otherwise returns false.
2525 \warning This function doesn't support custom types registered
2526 with qRegisterMetaType().
2529 \fn bool operator!=(const QVariant &v1, const QVariant &v2)
2533 Returns false if \a v1 and \a v2 are equal; otherwise returns true.
2535 \warning This function doesn't support custom types registered
2536 with qRegisterMetaType().
2539 /*! \fn bool QVariant::operator==(const QVariant &v) const
2541 Compares this QVariant with \a v and returns true if they are
2542 equal; otherwise returns false.
2544 In the case of custom types, their equalness operators are not called.
2545 Instead the values' addresses are compared.
2549 \fn bool QVariant::operator!=(const QVariant &v) const
2551 Compares this QVariant with \a v and returns true if they are not
2552 equal; otherwise returns false.
2554 \warning This function doesn't support custom types registered
2555 with qRegisterMetaType().
2558 static bool qIsNumericType(uint tp)
2560 return (tp >= QVariant::Bool && tp <= QVariant::Double)
2561 || (tp >= QMetaType::Long && tp <= QMetaType::Float);
2564 static bool qIsFloatingPoint(uint tp)
2566 return tp == QVariant::Double || tp == QMetaType::Float;
2571 bool QVariant::cmp(const QVariant &v) const
2574 if (d.type != v2.d.type) {
2575 if (qIsNumericType(d.type) && qIsNumericType(v.d.type)) {
2576 if (qIsFloatingPoint(d.type) || qIsFloatingPoint(v.d.type))
2577 return qFuzzyCompare(toReal(), v.toReal());
2579 return toLongLong() == v.toLongLong();
2581 if (!v2.canConvert(Type(d.type)) || !v2.convert(Type(d.type)))
2584 return handlerManager[d.type]->compare(&d, &v2.d);
2590 const void *QVariant::constData() const
2592 return d.is_shared ? d.data.shared->ptr : reinterpret_cast<const void *>(&d.data.ptr);
2596 \fn const void* QVariant::data() const
2602 void* QVariant::data()
2605 return const_cast<void *>(constData());
2610 Returns true if this is a NULL variant, false otherwise.
2612 bool QVariant::isNull() const
2614 return handlerManager[d.type]->isNull(&d);
2617 #ifndef QT_NO_DEBUG_STREAM
2618 QDebug operator<<(QDebug dbg, const QVariant &v)
2620 #ifndef Q_BROKEN_DEBUG_STREAM
2621 dbg.nospace() << "QVariant(" << QMetaType::typeName(v.userType()) << ", ";
2622 handlerManager[v.d.type]->debugStream(dbg, v);
2623 dbg.nospace() << ')';
2626 qWarning("This compiler doesn't support streaming QVariant to QDebug");
2632 QDebug operator<<(QDebug dbg, const QVariant::Type p)
2634 #ifndef Q_BROKEN_DEBUG_STREAM
2635 dbg.nospace() << "QVariant::" << QMetaType::typeName(p);
2638 qWarning("This compiler doesn't support streaming QVariant::Type to QDebug");
2646 /*! \fn void QVariant::setValue(const T &value)
2648 Stores a copy of \a value. If \c{T} is a type that QVariant
2649 doesn't support, QMetaType is used to store the value. A compile
2650 error will occur if QMetaType doesn't handle the type.
2654 \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 4
2656 \sa value(), fromValue(), canConvert()
2659 /*! \fn T QVariant::value() const
2661 Returns the stored value converted to the template type \c{T}.
2662 Call canConvert() to find out whether a type can be converted.
2663 If the value cannot be converted, \l{default-constructed value}
2666 If the type \c{T} is supported by QVariant, this function behaves
2667 exactly as toString(), toInt() etc.
2671 \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 5
2673 \sa setValue(), fromValue(), canConvert()
2676 /*! \fn bool QVariant::canConvert() const
2678 Returns true if the variant can be converted to the template type \c{T},
2683 \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 6
2688 /*! \fn static QVariant QVariant::fromValue(const T &value)
2690 Returns a QVariant containing a copy of \a value. Behaves
2691 exactly like setValue() otherwise.
2695 \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 7
2697 \note If you are working with custom types, you should use
2698 the Q_DECLARE_METATYPE() macro to register your custom type.
2700 \sa setValue(), value()
2704 \fn QVariant qVariantFromValue(const T &value)
2708 Returns a variant containing a copy of the given \a value
2709 with template type \c{T}.
2711 This function is equivalent to QVariant::fromValue(\a value).
2713 \note This function was provided as a workaround for MSVC 6
2714 which did not support member template functions. It is advised
2715 to use the other form in new code.
2717 For example, a QObject pointer can be stored in a variant with the
2720 \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 8
2722 \sa QVariant::fromValue()
2725 /*! \fn void qVariantSetValue(QVariant &variant, const T &value)
2729 Sets the contents of the given \a variant to a copy of the
2730 \a value with the specified template type \c{T}.
2732 This function is equivalent to QVariant::setValue(\a value).
2734 \note This function was provided as a workaround for MSVC 6
2735 which did not support member template functions. It is advised
2736 to use the other form in new code.
2738 \sa QVariant::setValue()
2742 \fn T qvariant_cast(const QVariant &value)
2745 Returns the given \a value converted to the template type \c{T}.
2747 This function is equivalent to QVariant::value().
2749 \sa QVariant::value()
2752 /*! \fn T qVariantValue(const QVariant &value)
2756 Returns the given \a value converted to the template type \c{T}.
2758 This function is equivalent to
2759 \l{QVariant::value()}{QVariant::value}<T>(\a value).
2761 \note This function was provided as a workaround for MSVC 6
2762 which did not support member template functions. It is advised
2763 to use the other form in new code.
2765 \sa QVariant::value(), qvariant_cast()
2768 /*! \fn bool qVariantCanConvert(const QVariant &value)
2772 Returns true if the given \a value can be converted to the
2773 template type specified; otherwise returns false.
2775 This function is equivalent to QVariant::canConvert(\a value).
2777 \note This function was provided as a workaround for MSVC 6
2778 which did not support member template functions. It is advised
2779 to use the other form in new code.
2781 \sa QVariant::canConvert()
2785 \typedef QVariantList
2788 Synonym for QList<QVariant>.
2792 \typedef QVariantMap
2795 Synonym for QMap<QString, QVariant>.
2799 \typedef QVariantHash
2803 Synonym for QHash<QString, QVariant>.
2807 \typedef QVariant::DataPtr
2812 \fn DataPtr &QVariant::data_ptr()