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
主要用于数据的传输和存储。