QString有一個未標記爲explicit
的構造函數QString(const QByteArray &ba)
,導致許多形參爲QString
的函數可以接受類型爲QByteArray
的實參,時間久了會會以爲這兩個類可以隨意混用,但實際並不是這樣,這兩個類適用的場景還是有區別的。
QString
相較QByteArray
更高級更抽象,QByteArray
則更底層更具體。QString
基本單位是一個個的Unicode
字符(QChar
),它不提供char *data()
這樣可以訪問其具體儲存內容的接口,只提供了QChar *data()
接口。QByteArray
的基本單位是一個個的字節,可視作char *
的替代品,提供了char *data()
用來訪問其存儲的字節。
大家都知道,同樣的字符使用不同的編碼保存在磁盤上時,其數據可能會不同。相應的,QString
提供了QByteArray toUtf8() const
和QByteArray toLatin1() const
這樣的接口對字符進行編碼,以及QString fromUtf8(const QByteArray &str)
和QString fromLatin1(const QByteArray &str)
這樣的接口對字節進行解碼。
QByteArray
類便於對數據進行存儲和傳輸,在這樣的場景時使用QByteArray
類比較合適。而對於其他場景,則是QString
比較合適。舉一個例子,QJsonDocument
是一個用於保存Json
對象的類,它提供了QByteArray toJson() const
和QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error = nullptr)
接口,而沒有提供QString
版本的接口,在我看來就是因爲Json
主要用於數據的傳輸和存儲。