1. 程式人生 > >QVariant類的使用注意事項

QVariant類的使用注意事項

QVariant類作為一個最為普遍的Qt資料型別的聯合。

因為c++禁止沒有建構函式和解構函式的聯合體,許多繼承的Qt類不能夠在聯合體當中使用。(聯合體當中的變數共用一個儲存區),沒有了聯合變數,我們在物體屬性以及資料庫的工作等方面受到很多的困擾。

一個QVariant物件在一個時間內只保留一種型別的值。我們可以使用canConvert來查詢是否能夠轉換當前的型別。轉換型別一般以toT()命名。

摘錄了一個example來說明QVariant的使用方法:


QDataStream out(...);
 QVariant v(123);                // The variant now contains an int
 int x = v.toInt();              // x = 123
 out << v;                       // Writes a type tag and an int to out
 v = QVariant("hello");          // The variant now contains a QByteArray
 v = QVariant(tr("hello"));      // The variant now contains a QString
 int y = v.toInt();              // y = 0 since v cannot be converted to an int
 QString s = v.toString();       // s = tr("hello")  (see QObject::tr())
 out << v;                       // Writes a type tag and a QString to out
 ...
 QDataStream in(...);            // (opening the previously written stream)
 in >> v;                        // Reads an Int variant
 int z = v.toInt();              // z = 123
 qDebug("Type is %s",            // prints "Type is int"
         v.typeName());
 v = v.toInt() + 100;            // The variant now hold the value 223
 v = QVariant(QStringList());你甚至可以儲存QList<QVariant>和QMap<QString ,QVariant>.所以你可以構造任意複雜的任意的資料型別。這個是非常強大而且又有用的。QVariant也支援null值,你可以定義一個 沒有任何值的型別,然而,也要注意QVariant型別只能在他們有值的時候被強制轉換。QVariant x, y(QString()), z(QString(""));
 x.convert(QVariant::Int);
 // x.isNull() == true
 // y.isNull() == true, z.isNull() == false
因 為QVariant是QtCore庫的一部分,它不能夠提供定義在QtGui當中的型別的轉換,如QColor,QImage,he QPixmap等。換句話說,沒有toColor()這樣的函式。取代的,你可以使用QVariant::value()或者 qVariantValue()這兩個模板函式。 QVariant variant;
 ...
 QColor color = variant.value<QColor>();
反向轉換(如把QColor轉成QVariant)是自動完成的。也包含了GUI相關的那些資料型別。
QColor color=palette().background().color();
QVariant variant=color;