Поскольку 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>();