QVariant

Автор: | 23 июля, 2019

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