首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Qt 核心類深度解析(五十一):QByteArray 與 QVariant —— 二進制數據與萬能類型容器

     編輯:關於C語言

QByteArray:原生二進制與 8 位文本的統一視圖

QByteArray API 與 QString 高度相似 (left(), right(), mid()...),但定位截然不同:

  • 存儲內容:原生二進制數據 (Raw Bytes) 或 8 位編碼文本 (Latin-1/ASCII)
  • 核心差異:不支援 Unicode**,不適合作為通用文本容器
  • 隱式 \0 結尾:自動在數據末尾補 \0,便利 const char* 轉換
  • 內部可含 \0**:不以 \0 判斷結尾,size() 返回真實字節數
最佳實踐:文本處理首選 QString**;二進制協議解析、文件讀寫、網絡數據報文處理用 QByteArray**。

QVariant:C++ 世界的「萬能類型」容器

為什麼需要 QVariant?

Java 有 Object 統一根類型,Object[] 可裝任意類型。C++ 無統一根類型,無法直接構建異構容器。QVariant 正是解決此痛點的「大而全」類型擋箭牌。

支援類型全景

核心用法示例

// 基礎存取
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 處理「數據無業務含義的原始字節」與「業務含義豐富的動態類型值」的雙重能力底座。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
類別代表類型
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...