本節內容首先講 QString 類的一些概念,然後是這個包裹著 Unicode 字元串的類可以對字元串進行什麼操作。可以這樣說,你所能想到的操作這個類都有。普通的操作(如插入、刪除等)就不贅述了,只講一些難懂的。
本文結構:
對於不清楚字元編碼是個啥東西的小白,可以看這篇文章科普一下:「字元編碼是個啥 - Qt必備技能」。
QString 類用於存儲 Unicode 字元串。在 Qt 中存儲一個 Unicode 字元是用 QChar 類,那麼 QString 就是存儲著一個個的 QChar。
QString 類採用了隱式共享方式來避免不必要的數據複製,減少了內存的使用。
關於 QString 類有幾個小點需要清楚:
比如有如下代碼,str 變數裡面存儲的數據是 Unicode 的編碼格式,接收方如果解析成亂碼,你就要想想兩方的編碼格式是不是都是 Unicode。如果不是的話,就需要用 QTextCodec 類來轉碼操作了。
QString str = "你好";
最常用的就是傳入一個 const char*,例如下列代碼。根據「超越 C++ 的 Qt 翻譯」中的「用 QString 包裹不需要翻譯的文本」所述,Qt 默認將來自 char* 的字元串視為 UTF-8 編碼格式,因此下列代碼會在內部調用 fromUtf8() 函數來進行 char* -> QString 的轉換。
QString str = "hello";
因為 Unicode 編碼格式是雙位元組存儲一個字,所以 QString 類裡面存儲著一個個的 16-bit QChar 字元,每個 QChar 字元對應著一個 Unicode 4.0 字元。如果字元的編碼大於65536時,用兩個 QChar 存儲這個字元。例如:
static const QChar data[4] = {0x0055, 0x006e, 0x10e3, 0x03a3}; QString str(data,4);
用 QChar 數組來構建 QString 是採用深拷貝的方式,意思就是說 QString 會完完全全複製一份 QChar 的數據。
(1)QString 複製 QChar 的數據時會進行深拷貝,意味著增加系統開銷。如果不想這樣,可以使用 fromRawData() 函數。
(2)可以使用 resize() 函數來設定好 QString 的容量並初始化每個值。因為 QString 類可以像 C++ 數組一樣用 operator[]() 訪問,所以對每個值初始化可以這樣做:
QString str; str.resize(4); str[0] = QChar(U); str[1] = QChar(n); str[2] = QChar(0x10e3); str[3] = QChar(0x03a3);
為什麼要預分配內存?因為 str 變數運行時可能會在結尾插入一些字元串,這時候系統會調用內存分配器來進行重新規劃,自然就增加了系統開銷。類似的函數還有一個 reserve()。
(3)如果僅僅是讀取 QString 中的字元,用 at() 函數更快。
(4)用 QLatin1String(str) 宏進行更高效的構建操作。我們知道把 QString 類型的字元串傳入某個函數時,有值傳遞和引用傳遞,這些都是程序運行時計算機才會去做的。那有沒有一種在編譯時就構建好一個 QString 字元串的方法呢?就是用 QLatin1String(str) 宏。比如下列代碼,程序在啟動運行前 str2 就已經完成了構建,而 str1 是運行時才會被構建。所以以後遇到提前就能確定字元串有哪些內容時,用 QLatin1String 宏包裹會稍微快一點。
QString str1 = "Hello"; QString str2 = QLatin1String("Hello");
其實一個字元串能幹什麼,無非就是修修改改之類的,所以這部分就是從基本信息、提取、修改、查詢、轉換、STL 迭代器、其他這幾個部分來說下,簡單的就不贅述了。
基本信息
先說 resize() 和 reserve() 這兩個函數吧。這兩個都可以調整 QString 對象的容量,resize() 比 reserve() 函數不同的是調整完空間容量後會自動用 來填充增加的空間。
其次就是 capacity() 和 size()。調用 capacity() 函數會返回空間容量,即這個 QString 對象可以存放多少字元。而調用 size() 函數會返回這段空間裏已經存放了多少字元。
提取
提取的作用反正就是從這一段字元串中提取出你想要的字元和字元串。對了,以上函數是 Qt 5.11 中的函數,低於該版本的可能有些函數沒有。
因為 QString 是對 Unicode 字元串的封裝,想要獲得最原始最底層的字元串的數據,就用 data() 函數即可獲得實際字元串首位字元的指針。用的還是比較多的。
section() 和 split() 函數也比較常用,因為簡單,所以不熟悉的看官方文檔即可。
修改
查詢
轉換
STL 風格迭代器
其他
以上就是 QString 類的情況,有啥疑問的可以在評論中留言。本節的內容還不算截稿,以後還會根據實際情況回來更新。