Qt 中用于表示字符串的類 QString類的詳細(xì)解讀
QString 類是 Qt 中用于表示字符串的類,實(shí)現(xiàn)在 QtCore 共享庫(kù)中。QString 類在實(shí)現(xiàn)上有以下特征。
1)字符串采用 Unicode 內(nèi)部編碼,可以表示世界上大多數(shù)語(yǔ)言的文字。
2)字符串的存儲(chǔ)有引用計(jì)數(shù),當(dāng)一個(gè) QString 對(duì)象被復(fù)制為另一個(gè) QString 對(duì)象時(shí),它們實(shí)際上指向相同的存儲(chǔ)空間,僅僅是增加一個(gè)引用計(jì)數(shù)。
?3)采用 “按需復(fù)制” 的技術(shù),當(dāng)指向相同存儲(chǔ)空間的多個(gè) QString 對(duì)象中的一個(gè)要被修改時(shí),將真正復(fù)制一個(gè)新的字符串并進(jìn)行修改。
構(gòu)造
QString 類提供了很多不同原型的構(gòu)造函數(shù)以方便使用。如:
Qstring();????????????????????????????????????????//?構(gòu)造空字符串 QString(QChar?ch);???????????????????????????//?由?QChar?對(duì)象?ch構(gòu)造 QString(const?QChar?*pch,?int?size);????//?由?QChar?數(shù)組pch構(gòu)造,size?是數(shù)組大小 QString(const?QString?&obj);??????????????//?拷貝構(gòu)造函數(shù) QString(const?char?*str);??????????????????//??由字符串?str?構(gòu)造,str是一個(gè)普通字符串
由于存在這些構(gòu)造函數(shù),凡是可以用 QString 類作為參數(shù)的地方,都可以安全地使用 QChar 對(duì)象或普通的字符串。
判斷?
可以用下面的成員函數(shù)判斷 QString 對(duì)象是否為空字符串:
bool?isEmpty()?const;????//?判斷是否為空字符串
轉(zhuǎn)換
QString 類提供了很多函數(shù)用于將字符串轉(zhuǎn)換為數(shù)值,如:
double?toDouble(bool?*ok?=?0)?const;?????????????????????????????????????//?轉(zhuǎn)換為高精度浮點(diǎn)數(shù) float?toFloat(bool?*ok?=?0)?cosnt;??????????????????????????????????????????//?轉(zhuǎn)換為浮點(diǎn)數(shù) int?toInt(bool?*ok,?int?base?=?10)?const;?????????????????????????????????//?轉(zhuǎn)換為整型數(shù) long?toLong(bool?*ok,?int?base?=?10)?cosnt;????????????????????????????//?轉(zhuǎn)換為長(zhǎng)整型 short?toShort(bool?*ok,?int?base?=?10)?const;??????????????????????????//?轉(zhuǎn)換為短整型 uint?toUInt(bool?*ok?=?0;?int?base?=?10)?const?????????????????????????//?轉(zhuǎn)換為無(wú)符號(hào)整型數(shù) ulong?toLong(bool?*ok?=?0,?int?base?=?10)?const;?????????????????????//?轉(zhuǎn)換為無(wú)符號(hào)長(zhǎng)整型數(shù)? ushort?toUShort(bool?*ok?=?0,?int?base?=?10)?const;?????????????????//?轉(zhuǎn)換為無(wú)符號(hào)短整型數(shù)
這些函數(shù)能夠解析 QString 對(duì)象的內(nèi)容,將其轉(zhuǎn)換為相應(yīng)的數(shù)值。其中 ok 參數(shù)指向一個(gè) bool 型變量, 這個(gè)參數(shù)用于輸出轉(zhuǎn)換是否成功的信息。base參數(shù)則是轉(zhuǎn)換為整數(shù)類型時(shí)的基。這些函數(shù)都不會(huì)改變 QString 對(duì)象自身。?
注意: 當(dāng)字符串以 0x開(kāi)頭時(shí),轉(zhuǎn)換的基自動(dòng)轉(zhuǎn)換為16, 當(dāng)字符串以0開(kāi)頭時(shí),轉(zhuǎn)換的基自動(dòng)為8。
下面這些成員函數(shù)可以將一個(gè)數(shù)值轉(zhuǎn)換為字符串并設(shè)為 QString 對(duì)象的值:
QString?&setNum(int?n,?int?base?=?10);???????????????????????????????????????????//?整型數(shù) QString?&setNum(uint?n,?int?base?=?10);?????????????????????????????????????????//?無(wú)符號(hào)整型數(shù) QString?&setNum(long?n,?int?base?=?10);????????????????????????????????????????//?長(zhǎng)整型 QString?&setNum(ulong?n,?int?base?=?10);???????????????????????????????????????//?無(wú)符號(hào)長(zhǎng)整型數(shù) QString?&setNum(short?n,?int?base?=?10);???????????????????????????????????????//?短整型數(shù) QString?&setNum(ushort?n,?int?base?=?10);??????????????????????????????????????//?無(wú)符號(hào)短整型數(shù) QString?&setNum(double?n,?char?format?=?'g',?int?precision?=?6);??????????//?高精度浮點(diǎn)數(shù) QString?&setNum(float?n,?char?format?=?'g',?int?precision?=?6);????????????//?浮點(diǎn)數(shù)
? ? ? ?將浮點(diǎn)數(shù)轉(zhuǎn)換為字符串時(shí),format 參數(shù)指定轉(zhuǎn)化格式,precision 參數(shù)指定轉(zhuǎn)換結(jié)果的精度,既有效數(shù)組的個(gè)數(shù)。注意這些函數(shù)會(huì)改變 QString 對(duì)象本身的值,而以下的函數(shù)則采用了不同的做法,它們返回一個(gè)新的臨時(shí)對(duì)象以供使用:
QString?number(int?n,?int?base?=?10); QString?number(uint?n,?int?base?=?10); QString?number(long?n,?int?base?=?10); QString?number(ulong?n?,int?base?=?10); QString?number(double?n,?char?format?=?'q',?int?precision?=?6);
這些函數(shù)都是靜態(tài)成員函數(shù),因而與某個(gè)具體的對(duì)象無(wú)關(guān),可以直接通過(guò)類名調(diào)用。
QString 類也提供了大小寫(xiě)轉(zhuǎn)換的函數(shù),如:
QString?toLower()?const;????//?轉(zhuǎn)換為小寫(xiě) QString?toUpper()?const;????//?轉(zhuǎn)換為大寫(xiě)
這些函數(shù)都不會(huì)改變 QString 對(duì)象本身,而是將轉(zhuǎn)換后的結(jié)果作為返回值。
比較
QString 類提供了一個(gè)函數(shù)用于兩個(gè) QString 對(duì)象的比較:
int?compare(const?QString?&s1,?const?QString?&s2,?Qt::CaseSensitivity?cs?=?Qt::CaseSensitive);
這是一個(gè)靜態(tài)成員函數(shù),它可以比較 s1 和 s2 的大小,參數(shù) cs 有以下兩個(gè)取值。
Qt::CaseInsensitive:?表示對(duì)大小寫(xiě)不敏感 Qt::Casesensitive?:????表示對(duì)大小寫(xiě)敏感
返回值的含義如下:大于 0 表示 s1 大于 s2,等于 0 表示 s1 等于 s2, 小于 0 表示 s1 小于 s2。
為了方便使用,QString 類還提供了以下重載函數(shù)用于比較:
int?compare(const?QString?&other,?Qt::CaseSensitivity?cs?=?Qt::CaseSensitive)?const;
這個(gè)函數(shù)用于比較 QString 對(duì)象自身和 QString 對(duì)象 other。
實(shí)際上更為直觀的是使用 QString 類的比較操作符,如
bool?operator?<?(StringType?other)?const;????????//?比較是否小于?other人 bool?operator??(StringType?other)?constt;???????//?比較是否大于?other bool?operator?>=?(StringType?other)?const;??????//?比較是否大于等于?other bool?operator?!=?(StringType?other)?const;???????//?比較是否不等于?other
? ? ? 這里的 StringType 指的是 (const QString &)或 (const char *),哥也就是說(shuō),這些操作副既可以與 QString 對(duì)象比較,也可以與普通的字符串比較。它們的局限性是第一個(gè)操作數(shù)必須是 QString 對(duì)象,因此,Qt 中又定義了以下操作符:
bool?operator?<?(const?char?*s1,?const?QString?&s2);?????????????????//?比較?s1?是否小于?s2 bool?operator??(const?char?*s1,?const?QString?&s2);?????????????????//?比較?s1?是否大于?s2 bool?operator?>=?(const?char?*s1,?const?QString?&s2);???????????????//?比較?s1?是否大于等于?s2 bool?operator?!=?(const?char?*s1,?const?QString?&s2);????????????????//?比較?s1?是否不等于?s2
這些操作符不是 QString 類的成員,它們的第一個(gè)參數(shù)是普通字符串。
? ? ? ??
?查找
?用以下的成員函數(shù)可以判斷 QString 對(duì)象是否包含指定的字符串或字符:
bool?contains(const?QString?&str,?Qt::CaseSensitivity?cs?=?Qt::CaseSensitive)?const;?????? bool?contains(cosnt?ch,?Qt::CaseSensitivity?cs?=?Qt::CaseSensitive)?const;
用以下的成員函數(shù)可以得到 QString 對(duì)象包含某個(gè)特定字符串或字符的個(gè)數(shù):
int?count(const?QString?&str,?Qt::CaseSensitivity?cs?=?Qt::CaseSensitive)?const; int?count(QChar?ch,?Qt::CaseSensitivity?cs?=?Qt::CaseSensitive)?const;
?用以下的成員函數(shù)可以得到 QString 對(duì)象中某個(gè)特定字符串或字符出現(xiàn)的位置:
int?indexOf(const?QString?&str,?int?from?=?0,?Qt::CaseSensitivity?cs?=?Qt::CaseSensitive)?const; int?indexOf(QChar?ch,?int?from?=?0,?Qt::CaseSensitivity?cs?=?Qt::CaseSensitive)?const;
? ? ? ? 這里參數(shù) from 是查找的起點(diǎn),它可以為負(fù)數(shù),-i 表示倒數(shù)第i個(gè)字符。查找的方向是從前往后。返回值是查找到的字符串或字符的位置,如果沒(méi)有找到則返回 -1。
? ? ? ? QString 類中還有與此功能相似的函數(shù)用于從后往前查找字符串或字符:
int?lastIndexOf(const?QString?&str,?int?from?=?-1,?Qt::CaseSensitivity?cs?=?Qt::CaseSensitive)?const; int?lastIndexOf(QChar?ch,?int?from?=?-1,?Qt::CaseSensitivity?cs?=?Qt::CaseSensitive)?const
?? ? 字符串處理
? ? ? ? QString ?類支持用賦值操作符進(jìn)行對(duì)象的復(fù)制,其賦值操作符的聲明如下:
QString?&operator?=?(const?QString?&other);????????//?復(fù)制另外一個(gè)?QString?對(duì)象 QString?&operator?=?(const?char?*str);???????????????//?復(fù)制普通字符串 QString?&operator?=?(char?ch);?????????????????????????//?復(fù)制字符 QString?&operator?=?(QChar?ch);???????????????????????//?復(fù)制?QChar?類對(duì)象
以下的成員函數(shù)可以將另一個(gè)字符串或字符接在 QString 對(duì)象后面,形成一個(gè)整體的字符串:
QString?&append(const?QString?&str);????????????????//?接續(xù)?QString?對(duì)象 QString?&append(const?char?*str);????????????????????//?接續(xù)普通字符串 QString?&append(QChar?ch);????????????????????????????//?接續(xù)?QChar?對(duì)象
它們的返回值是 QString 對(duì)象自己的引用,也就是說(shuō),可以用在這個(gè)返回值再次調(diào)用成員函數(shù),形成連續(xù)的字符串接續(xù)操作。
?為了讓代碼更直觀, QString 類中還定義了一個(gè)操作符用于字符串的接續(xù)
QString?&operator?+=?(const?QString?&other);?????//?續(xù)接?QString?對(duì)象 QString?&operator?+=?(const?char?*str);????//?續(xù)接普通字符串 QString?&operator?+=?(char?ch);????//?接續(xù)字符型數(shù)據(jù) QString?&operator?+=?(QChar?ch);???//?接續(xù)?QChar?對(duì)象
?它們的功能與 append 相同。由于 C++ 語(yǔ)言允許賦值操作符和復(fù)合賦值操作符的返回值作為左值使用,因此它們的返回值也被設(shè)計(jì)為 QString 對(duì)象自己的引用,故也可以連續(xù)操作。但由于復(fù)合賦值操作符的結(jié)合順序是從右往左,要想先計(jì)算左邊的操作數(shù)需要加括號(hào)。
? ? ? ??
? ? ? ?與 append 函數(shù)功能類似,以下的成員函數(shù)也能夠?qū)⒘硪粋€(gè)字符串或字符與 QString 對(duì)象連接起來(lái),但是接在原字符串的前面:
QString?&prepend(const?QString?&str);??????????//?在前面接續(xù)?QString?對(duì)象 QString?&prepend(const?char?*str);??????????????//?在前面接續(xù)普通字符串 QString?&prepend(QChar?ch);??????????????????????//?在前面接續(xù)?QChar?對(duì)象
功能更一般化的是在 QString 對(duì)象的任意位置插入另一個(gè)字符串或字符,如:
QString?&insert(int?position,?const?QString?&str);???????????????????//?插入字符串 QString?&insert(int?position,?const?QChar?*pch,?int?size);?????????//?插入?QChar?數(shù)組 QString?&insert(int?position,?QChar?ch);???????????????????????????????//?插入?QChar?對(duì)象
?這里 position 參數(shù)是要插入的位置,返回值也是對(duì) QString 對(duì)象自己的引用。?
? ? ? ?與插入相反的操作是移除 QString 對(duì)象中的一部分,如:
QString?&remove(int?position,?int?n);
這個(gè)函數(shù)可以移除 QString 對(duì)象中從位置 position 開(kāi)始的 n 個(gè)字符,
下面兩個(gè)成員函數(shù)則可以從 QString 對(duì)象中移除指定的字符串或字符:
QString?&remove(QChar?ch,?Qt::CaseSensitivity?cs?=?Qt::CaseSensitive); QString?&remove(const?QString?&str,?Qt::CaseSensitivity?cs?=?Qt::CaseSensitive);
?以下是 QString 對(duì)象的替換操作:
QString?&replace(int?position,?int?n,?const?QString?&after);????????????????????//?QString?對(duì)象 QString?&replace(int?position,?int?n,?const?QChar?*pch,?int?size);????????????//?QChar?數(shù)組 QString?&replace(int?opsition,?int?n,?QChar?after);????????????????????????????????//?QChar?對(duì)象
這三個(gè)函數(shù)的功能是將 QString 對(duì)象從 position 開(kāi)始的 n 個(gè)字符替換為新內(nèi)容,新內(nèi)容分別由 QString 對(duì)象、QChar 數(shù)組 和 QChar 對(duì)象表示。
?以下成員函數(shù)則可以搜索指定的字符串或字符并開(kāi)始替換:
QString?&replace(const?QString?&before,?const?QString?&after,?Qt::CaseSensitivity?cs?=?Qt::CaseSensitive);??????//?QString?替換為?QString QString?&replace(QChar?ch,?cosnt?QString?&after,?Qt::CaseSensitivity?cs?=?Qt::CaseSensitive);???????????????????????//?QChar?替換為?QString QString?&replace(QChar?before,?QChar?after,?Qt::CaseSensitivity?cs?=?Qt::CaseSensitive);??????????????????????????????//?Qchar?替換為?QChar
下面這個(gè)成員函數(shù)可以清空一個(gè) QString 對(duì)象的內(nèi)容,使之成為空字符串。
void?clear();
?而下面這個(gè)成員函數(shù)可以截?cái)?QStrring 對(duì)象,也就是去掉指定位置后的所有內(nèi)容:
void?truncate(int?position);??????//?從位置?position?截?cái)啵恢脧?開(kāi)始編號(hào)
下面這個(gè)成員函數(shù)可以截掉 QString 對(duì)象最后的若干個(gè)字符:
void?chop(int?n);?????//?截掉最后的?n個(gè)字符
以下幾個(gè)成員函數(shù)可以得到 QString 對(duì)象的子字符串:
QString?left(int?n)?const;??????//?得到左邊?n?個(gè)字符構(gòu)成的子字符串 QString?right(int?n)?const;????//?得到右邊?n?個(gè)字符構(gòu)成的子字符串 QString?mid(int?position,?int?n?=?-1)?const;??//?從中間得到子字符串
從中間得到子字符串時(shí),參數(shù) position 是子字符串的起始位置,參數(shù) n 是字符串的個(gè)數(shù),如果n 為 -1,則表示一直到原字符串的結(jié)尾。
注意上述三個(gè)函數(shù)并不修改 QString 對(duì)象自身,而是返回一個(gè)臨時(shí)對(duì)象以供使用。
下面這個(gè)成員函數(shù)可以截去 QString 對(duì)象中頭部和尾部的空白字符:
QString?trimmed()?const;
?? ? ? 空白字符包括空格、回車、換行、制表符等字符。下面這個(gè)成員函數(shù)不僅能去掉 QString 對(duì)象頭尾的空白字符,還能將中間的連續(xù)多個(gè)空白字符全部替換成一個(gè)空格:
QString?simlified()?const;
加法操作符可以將兩個(gè)字符串或字符連接起來(lái)并以 QString 臨時(shí)對(duì)象的方式返回:
const?QString?operator+(const?QString?&s1,?const?QString?&s2);??????? const?QString?operator+(const?QString?&s1,?const?char?*s2); const?QString?operator+(const?char?s1,?const?QString?&s2); const?QString?operator+(const?QString?&s,?char?ch);
注意加法操作符的兩個(gè)操作數(shù)中必須至少有一個(gè)是 QString 對(duì)象,否則無(wú)法重載操作符。顯然,加法操作副都不是 QString 類的成員。 ? ??
? ? ? ??
?索引
QString 類也像普通的字符串一樣可以根據(jù)下標(biāo)得到某個(gè)位置上的字符:
const?QChar?at(int?position)?const;
這是一個(gè)成員函數(shù),更直觀的方法是用以下的操作符:
const?QChar?operator[]?(int?position)?const; const?QChar?operator[]?(uint?position)?const;
? ? ? ? ?這樣對(duì) QString 對(duì)象的取字符操作就類似于對(duì)一個(gè)字符數(shù)組的操作。事實(shí)上,通過(guò)【】操作符得到的字符還可以被修改,要用到另外兩個(gè)重載的【】操作符:
QCharRef?operator[]?(int?position); QCharRef?operator[]?(uint?position);
返回的 QCharRef 類是一個(gè)輔助類,對(duì)它的修改將反映到原字符串中去。
統(tǒng)計(jì)
?以下兩個(gè)成員函數(shù)都可以得到 QString 對(duì)象中字符的個(gè)數(shù)
int?size()?const; int?length()?const;
注意字符的個(gè)數(shù)并不一定等于字節(jié)數(shù)。