| 類別 | 代表類型 |
| Qt 核心類型 | QString, QByteArray, QDateTime, QColor, QRect, QPoint, QSize, QFont, QPixmap... |
| C++ 基礎類型 | int, float, double, bool, char, long long, unsigned variants... |
| 容器類型 | QStringList, QList<QVariant>, QMap<QString, QVariant>... |
| GUI 類型 (需 QtGui) | QIcon, QPixmap, QCursor, QKeySequence, QPalette, QPen, QBrush... |
核心用法示例
// 基礎存取
QVariant v = 42;
int i = v.toInt(); // 42
QString s = v.toString(); // "42"
// 存儲自定義結構 (需 Q_DECLARE_METATYPE)
struct BusinessCard { QString name; QString phone; };
Q_DECLARE_METATYPE(BusinessCard)
BusinessCard card{"Alice", "13800001111"};
QVariant v2 = QVariant::fromValue(card);
if (v2.canConvert<BusinessCard>()) {
BusinessCard c = v2.value<BusinessCard>();
}
// 巢狀容器構建靈活數據模型
QMap<QString, QVariant> fruitMap;
fruitMap["Orange"] = 2.10;
fruitMap["Pear"] = QMap<QString, QVariant>{{"Standard", 1.95}, {"Organic", 2.25}};
// 數據流序列化 (需重載 << >> 並註冊)
qRegisterMetaTypeStreamOperators<BusinessCard>("BusinessCard");
關鍵機制
- 值語義 + 隱式共享:賦值廉價,修改時才深拷貝
- 類型安全:運行時
canConvert<T>() 檢查,避免錯誤提取
- Meta-Object 系統基石:信號槽參數傳遞、屬性系統、QSettings 持久化均依賴 QVariant
VC6 兼容性註記
舊版 VC6 不支援模板成員函數,需使用宏替代:
// VC6 替代方案
QVariant v = qVariantFromValue(card);
BusinessCard c = qVariantValue<BusinessCard>(v);
bool ok = qVariantCanConvert<BusinessCard>(v);
總結
QByteArray** 守護二進制邊界,**QVariant** 打破類型壁壘。二者結合,構建了 Qt 處理「數據無業務含義的原始字節」與「業務含義豐富的動態類型值」的雙重能力底座。
- 上一篇文章: Qt 核心類深度解析(五十):QString —— Unicode 時代的字符串利器
- 下一篇文章: 學語言 ≠ 會編程:給大三學弟的 C++ 職業發展與學習方法論
Copyright ©
程式碼之家 All Rights Reserved