標準c++提供了兩種字串,一種是c語言風格的以'\0'結尾的字元陣列,另一種是字串類string。而qt提供的qstring功能更強大。
qstring類儲存16位unicode值,提供了豐富的操作、查詢和轉換等函式。該類還進行使用影視共享(implicit sharing)、高效的記憶體分配策略等多方面的優化。
(1)操作字串
字串有如下幾個操作符。
1)qstring提供了乙個二元的"+"操作符用於組合兩個字串,並提供了"+="操作符用於將乙個字串追加到另乙個字串的末尾,例如:
qstring str1="welcome";
str1=str1+"to you!"; //str1="welcome to you!"
qstring str2="hello, ";
str2+="world!"; //str2="hello, world!"
其中,qstring str1="welcome "傳遞給qstring乙個const char *型別的ascii字串「welcome」,它將被解釋為乙個典型的以「\0」結尾的c型別字串。這將會導致呼叫qstring建構函式,來初始化乙個qstring字串。其建構函式原型為:
qt_ascii_cast_warn_constructor qstring::qstring(const char * str);
被傳遞的const char *型別的指標又將被函式qstring::fromascii()轉換為unicode編碼。預設情況下,函式qstring::fromascii()會將超過128的字元作為latin-l進行處理(可以通過呼叫qtextcodec::setcodecforcstring()函式改變qstring::fromascii()函式的處理方式)
此外,在編譯應用程式時,也可以通過定義qt_cast_from_ascii巨集變數遮蔽該建構函式。如果程式設計師要求顯示給使用者的字串都必須經過qobject::tr()函式的處理,那麼遮蔽qstring的這個建構函式是非常有用的。
qstring str1="welcome!";
qstring str2="to ";
3)組合字串的另乙個函式是qstring::sprintf(),該函式支援的格式定義符和c++庫中的函式sprintf()定義的一樣。例如:
qstring str;
str.sprintf("%s","welcome ");
str.sprintf("%s","to you!");
str.sprintf("%s %s","welcome","to you!");
4)qt還提供了另一種方便的字串組合方式,使用qstring::arg()函式,此函式的過載可以處理很多的資料型別。此外。一些過載具有額外的引數對字段的寬度、數字基數或者浮點數精度進行控制。通常,相對於函式qstring::sprintf(),函式qstring::arg()是乙個比較好的解決方案,因為它型別安全,完全支援unicode,並且允許改變「%n」引數的順序。例如:
qstring str;
str=qstring("%1 was born in %2.").arg("john").arg("1982"); //str="john was born in 1982."
其中,<1>「%1」被替換為「john」。
<2>「%2」被替換為「1982」。
5)qstring也提供了一些其他組合字串的方法,包括以下幾種。
insert()函式:在原字元特定的位置插入另乙個字串;
prepend()函式:在原字串的開頭插入另乙個字串;
replace()函式:用指定的字串替代原字串中的某些字元;
6)很多時候去掉乙個字串兩端的空白(空白字元包括回車字元「\n」、換行字元「\r」、製表符「\t」和空格字元「 「等)非常有用,如獲取使用者輸入的賬號時。
qstring::trimmed()函式:移除字串兩端的空白字元;
qstring::simplified()函式:移除字串兩端的空白字元,使用單個空格字元「 」替代字串中出現空白字元。
例如:qstring str=" welcome \t to \n you! ";
str=str.trimmed(); //str="welcome \t to \n you!"
在上述**中,如果使用str=str.simplified(),則str的結果是「welcome to you!」。
(2)查詢字串資料
查詢字串資料有多種方式,具體如下。
1)函式qstring::startswith()判斷乙個字串是否以某個字串開頭。此函式具有兩個引數,第乙個引數指定了乙個字串,第二個引數指定是否大小寫敏感(預設情況下,是大小寫敏感的),例如:
qstring str="welcome to you!";
str.startwith("welcome",qt::casesensitive); //返回true
str.startwith("you",qt::casesensitive); //返回false
2)函式qstring::endswith()類似於qstring::startswith(),此函式判斷乙個字串是否以某個字串結尾。
3)函式qstring::contains()判斷乙個字串是否出現過,例如:
qstring str="welcome to you!";
str.contains("welcome",qstring::casesensitive); //返回true;
4)比較兩個字串也是經常使用的功能,qstring提供了多種比較手段。
operator<(const qstring&):比較乙個字串是否小於另乙個字串,如果是,則返回true.
operator<=(const qstring&):比較乙個字串是否小於等於另乙個字串,如果是,返回true,否則返回false;
operator==(const qstring&):比較乙個字串是否等於另乙個字串,如果是,返回true,否則返回false;
operator>=(const qstring&):比較乙個字串是否大於等於另乙個字串,如果是,返回true,否則返回false;
localawarecompare(const qstring&,const qstring&):靜態函式,比較前後兩個字串。如果前面字串小於後面字串,返回負整數值,如果前面字元等於後面字串,返回0,如果前面字串大於後面字串,返回正整數值。該函式的比較是基於本地字符集的,而且是平台相關的。通常該函式用於向使用者顯示乙個有序的字串列表。
compare(const qstring&,const qstring&,qt::casesensitivity):該函式可以指定是否進行大小寫的比較,而大小寫的比較是基於unicode編碼值的,所以比較非常快,返回值類似上面那個函式.
(3)字串的轉換
qstring提供了豐富的轉換函式,可以將乙個字串轉換為數值型別或者其它的字元編碼集。
1)qstring::toint()函式將字串轉換為整型數值,類似的函式還有todouble()、tofloat()、tolong()、tolonglong()等。下面舉個例子說明其用法:
qstring str="125";
bool ok;
int hex=str.toint(&ok,16); //ok=true,hex=293
int dec=str.toint(&ok,10); //ok=true,dec=125
其中,qstring str="125";初始化乙個"125"字串
int hex=str.toint(&ok,16); 呼叫qstring::toint()函式將字串轉換為整型數值。函式qstring::toint()有兩個引數,第乙個引數是乙個bool型別的指標,用於返回轉換的狀態,當轉換成功時設定為true,否則設定成false.第二個引數指定了轉換的基數。當基數設定為0時,將會使用c語言的轉換方法,即如果字串以「0x」開頭,則基數是16;如果字串以「0」開頭,則基數是8;否則基數一律是10;
2)qstring提供的字元編碼集的轉換函式將會返回乙個const char *型別版本的qbytearray,即建構函式qbytearry(const char *)構造的qbytearray物件。qbytearray類具有乙個位元組陣列,它既可以儲存原始位元組(raw bytes),也可以儲存傳統的以「\0」結尾的8位的字串。在qt中,使用qbytearray()比使用const char *更方便,且qbytearray也支援隱式共享。轉換函式有以下幾種。
toascii():返回乙個ascii編碼的8位字串。
tolatin-l():返回乙個latin-l(iso8859-1)編碼的8位字串
toutf8():返回乙個utf-8編碼的8位字串(utf-8是ascii的超集,它支援整個unicode字符集)
下面舉例說明其用法:
qstring str="welcome to you!";
qbytearray ba=str.toascii();
qdebug()《其中,
qstring str="welcome to you!";初始化乙個字串物件
qbytearray ba=str.toascii();通過qstring::toascii()函式,將unicode編碼的字串轉換為ascii碼的字串,並儲存在qbytearray物件中。
qdebug()《注意:null字串和空(empty)字串的區別
乙個null字串就是使用qstring的預設建構函式或者使用「(const char *)0」作為引數的建構函式建立的qstring字串物件;而乙個空字串是乙個大小為0的字串。乙個null字串一定是乙個空字串,而乙個空字串未必是乙個null字串。例如:
qstring().isnull(); //結果為true
qstring().isempty(); //結果為true
qstring("").isnull(); //結果為false
qstring("").isempty(); //結果為true
QT之字串類
前面我們講解了開發計算器的訊號處理機制,接下來我們來講講關於字串顯示的問題。我們都知道 c 語言不支援真正意義上的字串 c 語言是用字元陣列和一組函式來實現字串操作的 c 語言不支援自定義型別,因此我們無法獲得字串型別。從 c 到 c 的進化過程引入了自定義型別,在 c 中可以通過類完成字串型別的定...
字串,QT字串類,c 字串類之間的轉換
1.std string轉換成qstring string std str abc qstring q str qstring fromstdstring std str 2.qstring轉換成std string qstring q str abc string q str.tostdstrin...
Qt學習01 字串類
pr 標準c 提供的字串有兩種 1 以 0 結尾的字元陣列 2 字串類string。qt使用的字串類qstring,儲存16位unicode值,除了操作 查詢 轉換函式,還使用了隱式共享並優化記憶體分配策略。qstring str1 welcome qstring str2 str1 to str2...