本節內容首先講 QString 類的一些概念,然後是這個包裹著 Unicode 字元串的類可以對字元串進行什麼操作。可以這樣說,你所能想到的操作這個類都有。普通的操作(如插入、刪除等)就不贅述了,只講一些難懂的。

本文結構:


概述

對於不清楚字元編碼是個啥東西的小白,可以看這篇文章科普一下:「字元編碼是個啥 - Qt必備技能」。

QString 類用於存儲 Unicode 字元串。在 Qt 中存儲一個 Unicode 字元是用 QChar 類,那麼 QString 就是存儲著一個個的 QChar。

QString 類採用了隱式共享方式來避免不必要的數據複製,減少了內存的使用。

幾個需要注意的點

關於 QString 類有幾個小點需要清楚:

  • QString 類存儲的字元串默認是 Unicode

比如有如下代碼,str 變數裡面存儲的數據是 Unicode 的編碼格式,接收方如果解析成亂碼,你就要想想兩方的編碼格式是不是都是 Unicode。如果不是的話,就需要用 QTextCodec 類來轉碼操作了。

QString str = "你好";

  • 來自 char* 的數據 - 默認被當作 UTF-8 編碼格式

最常用的就是傳入一個 const char*,例如下列代碼。根據「超越 C++ 的 Qt 翻譯」中的「用 QString 包裹不需要翻譯的文本」所述,Qt 默認將來自 char* 的字元串視為 UTF-8 編碼格式,因此下列代碼會在內部調用 fromUtf8() 函數來進行 char* -> QString 的轉換。

QString str = "hello";

  • 用 QChar 構建的 QString - 會進行深拷貝

因為 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 迭代器、其他這幾個部分來說下,簡單的就不贅述了。

基本信息

  • 容量
    • 可以容納多少字元:int capacity() const
    • 現有字元數量
      • int size() const
      • int length() const
    • 調整容量
      • 填充0:void resize(int size)
      • 不填充:void reserve(int size)
  • 是否空
    • bool isEmpty() const
    • bool isNull() const
  • 閱讀順序:bool isRightToLeft() const

先說 resize() 和 reserve() 這兩個函數吧。這兩個都可以調整 QString 對象的容量,resize() 比 reserve() 函數不同的是調整完空間容量後會自動用 來填充增加的空間。

其次就是 capacity() 和 size()。調用 capacity() 函數會返回空間容量,即這個 QString 對象可以存放多少字元。而調用 size() 函數會返回這段空間裏已經存放了多少字元。

提取

  • 字元
    • 開頭:QChar front() const
    • 中間:const QChar at(int position) const
    • 最後:QChar back() const
  • 字元串
    • 開頭
      • QString left(int n) const
      • QString leftJustified(int width, QChar fill = QLatin1Char( ), bool truncate = false) const
      • 除結尾n個之外的:QString chopped(int len) const
    • 中間:QString mid(int position, int n = -1) const
    • 最後
      • QString right(int n) const
      • QString rightJustified(int width, QChar fill = QLatin1Char( ), bool truncate = false) const
    • 片段
      • QString section(......) const
      • QStringList split(......) const
  • 實際數據
    • QChar * data()
    • const QChar * constData() const

提取的作用反正就是從這一段字元串中提取出你想要的字元和字元串。對了,以上函數是 Qt 5.11 中的函數,低於該版本的可能有些函數沒有。

因為 QString 是對 Unicode 字元串的封裝,想要獲得最原始最底層的字元串的數據,就用 data() 函數即可獲得實際字元串首位字元的指針。用的還是比較多的。

section() 和 split() 函數也比較常用,因為簡單,所以不熟悉的看官方文檔即可。

修改

    • 添加
    • 開頭
      • QString & prepend(......)
      • void push_front(......)
    • 中間:QString & insert(......)
    • 結尾
      • QString & append(......)
      • void push_back(......)
  • 刪除
    • 清空:void clear()
    • 從末尾刪除:void chop(int n)
    • 保留前n個:void truncate(int position)
  • 替換:QString & replace(......)
  • 填充:QString & fill(QChar ch, int size = -1)
  • 重複:QString repeated(int times) const
  • 修剪空格
    • 前中後:QString simplified() const
    • 前後:QString trimmed() const
  • 交換:void swap(QString &other)
  • 格式化:QString normalized(QString::NormalizationForm mode, QChar::UnicodeVersion version = QChar::Unicode_Unassigned) const

查詢

  • 是否包含
    • 開頭:bool startsWith(......) const
    • 中間:bool contains(......) const
    • 結尾:bool endsWith(......) const
  • 出現次數:int count(......) const
  • 定位
    • 前->後:int indexOf(......) const
    • 前<-後:int lastIndexOf(......) const

轉換

  • 大小寫
    • 大寫:QString toUpper() const
    • 小寫:QString toLower() const
  • 數字
    • QString & setNum(......)
    • [static]QString number(......)
    • toInt
    • toDouble
    • toFloat
    • toLong
    • toLongLong
    • toUInt
    • toULong
    • toULongLong
    • toUShort
    • toShort
  • 原始數據
    • QString & setRawData(const QChar *unicode, int size)
    • QString fromRawData(const QChar *unicode, int size)
  • Unicode 系列
    • QString & setUnicode(const QChar *unicode, int size)
    • QString & setUtf16(const ushort *unicode, int size)
    • QString fromLatin1(const char *str, int size = -1)
    • QString fromLocal8Bit(const char *str, int size = -1)
    • QString fromUcs4(const uint *unicode, int size = -1)
    • QString fromUcs4(const char32_t *str, int size = -1)
    • QString fromUtf8(const char *str, int size = -1)
    • QString fromUtf16(const ushort *unicode, int size = -1)
    • QString fromWCharArray(const wchar_t *string, int size = -1)
    • toLatin1()
    • toLocal8Bit()
    • toUcs4()
    • toUtf8()
    • utf16()
    • toWCharArray()
  • std
    • QString fromStdString(const std::string &str)
    • QString fromStdU16String(const std::u16string &str)
    • QString fromStdU32String(const std::u32string &str)
    • QString fromStdWString(const std::wstring &str)
    • toStdString()
    • toStdU16String()
    • toStdU32String()
    • toStdWString()
  • iOS/OS X
    • QString fromCFString(CFStringRef string)
    • QString fromNSString(const NSString *string)
    • toCFString()
    • toNSString()
  • 其他
    • QString toCaseFolded() const
    • QString toHtmlEscaped() const

STL 風格迭代器

    • 指向開頭
    • QString::iterator begin()
    • QString::const_iterator cbegin() const
    • QString::const_iterator constBegin() const
    • 反向
      • QString::const_reverse_iterator crbegin() const
      • QString::reverse_iterator rbegin()
  • 指向結尾
    • QString::iterator end()
    • QString::const_iterator cend() const
    • QString::const_iterator constEnd() const
    • 反向
      • QString::const_reverse_iterator crend() const
      • QString::reverse_iterator rend()

其他

  • arg參數:QString arg(......) const
  • 對比
    • int compare(......) const
    • int localeAwareCompare(......) const
  • 釋放:
    • void shrink_to_fit()
    • void squeeze()

以上就是 QString 類的情況,有啥疑問的可以在評論中留言。本節的內容還不算截稿,以後還會根據實際情況回來更新。


推薦閱讀:
相關文章