На этом шаге рассмотрим произвольный тип QVariant.
Объекты класса QVariant могут содержать данные разного типа, включая контейнеры. К этим типам относятся: int, unsigned int, double, bool, QString, QStringList, QImage, QPixmap, QBrush, QColor, QRegExp и др. Важно учитывать то обстоятельство, что частое применение этого типа может отрицательно отразиться на скорости программы и эффективности использования памяти, а также может заметно снизить читабельность самой программы. Поэтому объекты класса QVariant не следует использовать без особой на то необходимости.
Для создания объектов класса QVariant необходимо передать в конструктор переменную нужного типа. Например:
QVariant v1(34); QVariant v2(true); QVariant v2("Turbo Pascal");
Метод type() позволяет узнать тип записанных в объекте QVariant данных. Этот метод возвращает целочисленный идентификатор типа. Чтобы преобразовать его в строку, следует передать его в статический метод typeToName(). Того же результата можно добиться и вызовом метода typeName(), который возвращает информацию о типе в виде строки:
QVariant v(5.0);
qDebug() << QVariant::typeToName(v.type()); // =>double
Чтобы получить данные из объекта QVariant нужного типа, существует серия специальных методов toT(), где T — это имя типа. Метод toT() создает новый объект типа T и копирует данные из объекта QVariant в нужный объект. Например:
QVariant v2(23);
int a = v2.toInt() + 5; // a = 28
Ввиду того, что QVariant реализован в QtCore, соответствующих методов toT() для классов QColor, QImage и QPixmap и др., находящихся в модуле QtGui, не предоставляется.
Вместо методов toT() для приведения к нужному типу можно использовать также шаблонный метод value<T>(). Наш пример с преобразованием объекта QVariant к целому типу можно преобразовать следующим образом:
QVariant v2(23);
int a = v2.value<int>() + 5; //a = 28
На следующем шаге рассмотрим модель общего использования данных.