這段時間回家,一直沒有來得及寫,今天才發現博客的編輯器有了新版。仍是先來試試新版編輯器的功能吧!安全
今天要說的是QString。之因此把QString單獨拿出來,是由於string是很經常使用的一個數據結構,甚至在不少語言中,好比JavaScript,都是把string做爲一種同int等同樣的基本數據結構來實現的。數據結構
每個GUI程序都須要string,這些string能夠用在界面上的提示語,也能夠用做通常的數據結構。C++語言提供了兩種字符串的實現:C風格的字符串,以'\0‘結尾;std::string,即標準模版庫中的類。Qt則提供了本身的字符串實現:QString。QString以16位Uniode進行編碼。咱們日常用的ASCII等一些編碼集都做爲Unicode編碼的子集提供。關於編碼的問題,咱們會到之後的時候再詳細說明。app
在使用QString的時候,咱們不須要擔憂內存分配以及關於'\0'結尾的這些注意事項。QString會把這些問題解決。一般,你能夠把QString看做是一個QChar的向量。另外,與C風格的字符串不一樣,QString中間是能夠包含'\0'符號的,而length()函數則會返回整個字符串的長度,而不只僅是從開始到'\0'的長度。編輯器
同Java的String類相似,QString也重載的+和+=運算符。這兩個運算符能夠把兩個字符串鏈接到一塊兒,正像Java裏面的操做同樣。QString能夠自動的對佔用內存空間進行擴充,這種鏈接操做是恨迅速的。下面是這兩個操做符的使用:ide
- QString str = "User: ";
- str += userName + "\n";
QString的append()函數則提供了相似的操做,例如:函數
- str = "User: ";
- str.append(userName);
- str.append("\n");
C語言中有printf()函數做爲格式化輸出,QString則提供了一個sprintf()函數實現了相同的功能:性能
- str.sprintf("%s %.1f%%", "perfect competition", 100.0);
這句代碼將輸出:perfect competition 100.0%,同C語言的printf()同樣。不過前面咱們也見到了Qt提供的另外一種格式化字符串輸出的函數arg():編碼
- str = QString("%1 %2 (%3s-%4s)")
- .arg("permissive").arg("society").arg(1950).arg(1970);
這段代碼中,%1, %2, %3, %4做爲佔位符,將被後面的arg()函數中的內容依次替換,好比%1將被替換成permissive,%2將被替換成society,%3將被替換成1950,%4將被替換曾1970,最後,這句代碼輸出爲:permissive society (1950s-1970s). arg()函數比起sprintf()來是類型安全的,同時它也接受多種的數據類型做爲參數,所以建議使用arg()函數而不是傳統的sprintf()。url
使用static的函數number()能夠把數字轉換成字符串。例如:spa
- QString str = QString::number(54.3);
你也可使用非static函數setNum()來實現相同的目的:
- QString str;
- str.setNum(54.3);
而一系列的to函數則能夠將字符串轉換成其餘基本類型,例如toInt(), toDouble(), toLong()等。這些函數都接受一個bool指針做爲參數,函數結束以後將根據是否轉換成功設置爲true或者false:
- bool ok;
- double d = str.toDouble(&ok);
- if(ok)
- {
- // do something...
- } else {
- // do something...
- }
對於QString,Qt提供了不少操做函數,例如,使用mid()函數截取子串:
- QString x = "Nine pineapples";
- QString y = x.mid(5, 4); // y == "pine"
- QString z = x.mid(5); // z == "pineapples"
mid()函數接受兩個參數,第一個是起始位置,第二個是取串的長度。若是省略第二個參數,則會從起始位置截取到末尾。正如上面的例子顯示的那樣。
函數left()和rigt()相似,都接受一個int類型的參數n,都是對字符串進行截取。不一樣之處在於,left()函數從左側截取n個字符,而right()從右側開始截取。下面是left()的例子:
- QString x = "Pineapple";
- QString y = x.left(4); // y == "Pine"
函數indexOf()返回字符串的位置,如:
- QString x = "sticky question";
- QString y = "sti";
- x.indexOf(y); // returns 0
- x.indexOf(y, 1); // returns 10
- x.indexOf(y, 10); // returns 10
- x.indexOf(y, 11); // returns -1
函數startsWith()和endsWith()能夠檢測字符串是否是以某個特定的串開始或結尾,例如:
- if (url.startsWith("http:") && url.endsWith(".png"))
- {
- }
這段代碼等價於
- if (url.left(5) == "http:" && url.right(4) == ".png")
- {
- }
不過,前者要比後者更加清楚簡潔,而且性能也更快一些。
QString還提供了replace()函數供實現字符串的替換功能;trimmed()函數去除字符串兩側的空白字符(注意,空白字符包括空格、Tab以及換行符,而不只僅是空格);toLower()和toUpper()函數會將字符串轉換成小寫大寫字符串;remove()和insert()函數提供了刪除和插入字符串的能力;simplified()函數能夠將串中的全部連續的空白字符替換成一個,而且把兩端的空白字符去除,例如" \t 」會返回一個空格" "。
將const char *類型的C風格字符串轉換成QString也是很常見的需求,簡單來講,QString的+=便可完成這個功能:
- str += " (1870)";
這裏,咱們將const char * 類型的字符串" (1870)"轉換成爲QString類型。若是須要顯式的轉換,可使用QString的強制轉換操做,或者是使用函數fromAscii()等。爲了將QString類型轉成const char *字符串,須要進行兩步操做,一是使用toAscii()得到一個QByteArray類型對象,而後調用它的data()或者constData()函數,例如:
- printf("User: %s\n", str.toAscii().data());
爲了方便使用,Qt提供了一個宏qPrintable(),這個宏等價於toAscii().constData(),例如:
- printf("User: %s\n", qPrintable(str));
咱們調用QByteArray類上面的data()或者constData()函數,將得到QByteArray內部的一個const char*類型的字符串,所以,咱們不須要擔憂內存泄漏等的問題,Qt會替咱們管理好內存。不過這也暗示咱們,注意不要使用這個指針太長時間,由於若是QByteArray被delete,那麼這個指針也就成爲野指針了。若是這個QByteArray對象沒有被放在一個變量中,那麼當語句結束後,QbyteArray對象就會被delete,這個指針也就被delete 了。