Поскольку C ++ запрещает объединениям включать типы, которые имеют конструкторы или деструкторы не по умолчанию, объект QVariant содержит единственное значение одного типа () за раз. Узнать какой тип value <T>() содержит вариант, преобразовать его в другой тип с помощью convert(), получить его значение с помощью одного из toT() выполнить функции и проверить, можно ли преобразовать тип в конкретный тип с помощью canConvert(). Методы с именем toT() (например, toInt(), toString()) являются константными. Если запрашивать хранимый тип, они возвращают копию хранимого объекта. Если запрашивать тип, который может быть сгенерирован из сохраненного типа, toT() копирует и преобразует, и оставляет сам объект без изменений.
Для большинства встроенных классов Qt предусмотрены встроенные конструкторы. Если перепутать запрашиваемый класс, будет возвращено значение по умолчанию.
Рассмотрим несколько примеров реализации:
QVariant var1( 5 ); QVariant var2( "Test" ); QVariant var3( QRect( 1, 2, 3, 4 ) ); QVariant var4( 1.2 ); QVariant var3( QRect( 1, 2, 3, 4 ) );
Вариант с использованием контейнера:
QMap<int, QString> mapping; mapping.insert(1, "One"); mapping.insert(2, "Two"); mapping.insert(3, "Three"); QVariant variant = QVariant::fromValue(mapping); if (variant.canConvert<QVariantHash>()) { QAssociativeIterable iterable = variant.value<QAssociativeIterable>(); QAssociativeIterable::const_iterator it = iterable.begin(); const QAssociativeIterable::const_iterator end = iterable.end(); for ( ; it != end; ++it) { qDebug() << *it; qDebug() << it.key(); qDebug() << it.value(); } }
В результате будет выведено следующее:
QVariant(QString, "One") QVariant(int, 1) QVariant(QString, "One") QVariant(QString, "Two") QVariant(int, 2) QVariant(QString, "Two") QVariant(QString, "Three") QVariant(int, 3) QVariant(QString, "Three")
Получить значения можно с помощью выполнение функции toT():
qDebug() << var1.toInt(); qDebug() << var2.toString(); qDebug() << var3.toRect(); qDebug() << var4.toDouble(); qDebug() << var5.toTime(); qDebug() << var6.toDateTime(); qDebug() << var7.toDate();
Способ с использованием преобразование типа value <T>():
qDebug() << var1.value<int>(); qDebug() << var2.value<QString>(); qDebug() << var3.value<QRect>(); qDebug() << var4.value<double>(); qDebug() << var5.value<QTime>(); qDebug() << var6.value<QDateTime>(); qDebug() << var7.value<QDate>();