鍍金池/ 教程/ C/ QString
Qt 容器和算法拾遺
自定義 model 之一
反走樣
Hello, world!
Qt 容器類之關(guān)聯(lián)存儲容器
QStringListModel
拖放技術(shù)之一
狀態(tài)欄
QTreeWidget
拖放技術(shù)之二
通用算法
event()
Qt 學(xué)習(xí)之路(18): Qt 標(biāo)準(zhǔn)對話框之 QInputDialog
Qt 容器類之遍歷器和隱式數(shù)據(jù)共享
QListWidget
Meta-Object 系統(tǒng)
事件接收與忽略
Qt 學(xué)習(xí)之路(tip): parent 參數(shù)
Qt 標(biāo)準(zhǔn)對話框之 QColorDialog
QPainter(續(xù))
國際化(下)
漸變填充
自定義委托
創(chuàng)建 shared library
model-view 架構(gòu)
Graphics View Framework
自定義拖放數(shù)據(jù)對象
QSortFilterProxyModel
國際化(上)
組件布局
自定義 Model 之三
事件過濾器
QDirModel
Hello, world!(續(xù))
Qt 標(biāo)準(zhǔn)對話框之 QFileDialog
自定義 model 之二
深入了解信號槽
坐標(biāo)變換
剪貼板操作
QTableWidget
QByteArray 和 QVariant
創(chuàng)建一個對話框(下)
Qt 學(xué)習(xí)之路(32): 一個簡易畫板的實現(xiàn)(Graphics View)
文本文件讀寫
自定義事件
編寫跨平臺的程序
MainWindow
初探信號槽
Qt 學(xué)習(xí)之路(17): Qt 標(biāo)準(zhǔn)對話框之 QMessageBox
繪圖設(shè)備
菜單和工具條(續(xù))
二進(jìn)制文件讀寫
QString
事件(event)
菜單和工具條
QPainter
Qt 容器類之順序存儲容器
進(jìn)程間交互
API 文檔的使用
創(chuàng)建一個對話框(上)
一個簡易畫板的實現(xiàn)(QWidget)

QString

這段時間回家,一直沒有來得及寫,今天才發(fā)現(xiàn)博客的編輯器有了新版。還是先來試試新版編輯器的功能吧!

今天要說的是 QString。之所以把 QString 單獨拿出來,是因為 string 是很常用的一個數(shù)據(jù)結(jié)構(gòu),甚至在很多語言中,比如 JavaScript,都是把 string 作為一種同 int 等一樣的基本數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)的。

每一個 GUI 程序都需要 string,這些 string 可以用在界面上的提示語,也可以用作一般的數(shù)據(jù)結(jié)構(gòu)。C++語言提供了兩種字符串的實現(xiàn):C 風(fēng)格的字符串,以'\0‘結(jié)尾;std::string,即標(biāo)準(zhǔn)模版庫中的類。Qt 則提供了自己的字符串實現(xiàn):QString。QString 以16位 Uniode 進(jìn)行編碼。我們平常用的 ASCII 等一些編碼集都作為 Unicode 編碼的子集提供。關(guān)于編碼的問題,我們會到以后的時候再詳細(xì)說明。

在使用 QString 的時候,我們不需要擔(dān)心內(nèi)存分配以及關(guān)于'\0'結(jié)尾的這些注意事項。QString 會把這些問題解決。通常,你可以把 QString 看作是一個 QChar 的向量。另外,與 C 風(fēng)格的字符串不同,QString 中間是可以包含'\0'符號的,而 length()函數(shù)則會返回整個字符串的長度,而不僅僅是從開始到'\0'的長度。

同 Java 的 String 類類似,QString 也重載的+和+=運算符。這兩個運算符可以把兩個字符串連接到一起,正像 Java 里面的操作一樣。QString 可以自動的對占用內(nèi)存空間進(jìn)行擴(kuò)充,這種連接操作是恨迅速的。下面是這兩個操作符的使用:


QString str = "User: ";  
str += userName + "\n"; 

QString 的 append()函數(shù)則提供了類似的操作,例如:


str = "User: ";  
str.append(userName);  
str.append("\n");

C 語言中有 printf()函數(shù)作為格式化輸出,QString 則提供了一個 sprintf()函數(shù)實現(xiàn)了相同的功能:


str.sprintf("%s %.1f%%", "perfect competition", 100.0); 

這句代碼將輸出:perfect competition 100.0%,同 C 語言的 printf()一樣。不過前面我們也見到了 Qt 提供的另一種格式化字符串輸出的函數(shù) arg():


str = QString("%1 %2 (%3s-%4s)")  
      .arg("permissive").arg("society").arg(1950).arg(1970); 

這段代碼中,%1, %2, %3, %4作為占位符,將被后面的 arg()函數(shù)中的內(nèi)容依次替換,比如%1將被替換成 permissive,%2將被替換成 society,%3將被替換成1950,%4將被替換曾1970,最后,這句代碼輸出為:permissive society (1950s-1970s). arg()函數(shù)比起 sprintf()來是類型安全的,同時它也接受多種的數(shù)據(jù)類型作為參數(shù),因此建議使用 arg()函數(shù)而不是傳統(tǒng)的 sprintf()。 使用 static 的函數(shù) number()可以把數(shù)字轉(zhuǎn)換成字符串。例如:


QString str = QString::number(54.3); 

你也可以使用非 static 函數(shù) setNum()來實現(xiàn)相同的目的:


QString str;  
str.setNum(54.3); 

而一系列的 to 函數(shù)則可以將字符串轉(zhuǎn)換成其他基本類型,例如 toInt(), toDouble(), toLong()等。這些函數(shù)都接受一個 bool 指針作為參數(shù),函數(shù)結(jié)束之后將根據(jù)是否轉(zhuǎn)換成功設(shè)置為 true 或者false:


bool ok;  
double d = str.toDouble(&ok);  
if(ok)  
{  
    // do something...  
} else {  
    // do something...  
} 

對于 QString,Qt 提供了很多操作函數(shù),例如,使用 mid()函數(shù)截取子串:


QString x = "Nine pineapples";  
QString y = x.mid(5, 4);            // y == "pine"  
QString z = x.mid(5);               // z == "pineapples" 

mid()函數(shù)接受兩個參數(shù),第一個是起始位置,第二個是取串的長度。如果省略第二個參數(shù),則會從起始位置截取到末尾。正如上面的例子顯示的那樣。

函數(shù) left()和 rigt()類似,都接受一個 int 類型的參數(shù) n,都是對字符串進(jìn)行截取。不同之處在于,left()函數(shù)從左側(cè)截取 n 個字符,而 right()從右側(cè)開始截取。下面是 left()的例子:


QString x = "Pineapple";  
QString y = x.left(4);      // y == "Pine" 

函數(shù) 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 

函數(shù) startsWith()和 endsWith()可以檢測字符串是不是以某個特定的串開始或結(jié)尾,例如:


if (url.startsWith("http:") && url.endsWith(".png"))  
{  
} 

這段代碼等價于


if (url.left(5) == "http:" && url.right(4) == ".png")  
{  
} 

不過,前者要比后者更加清楚簡潔,并且性能也更快一些。

QString 還提供了 replace()函數(shù)供實現(xiàn)字符串的替換功能;trimmed()函數(shù)去除字符串兩側(cè)的空白字符(注意,空白字符包括空格、Tab 以及換行符,而不僅僅是空格);toLower()和 toUpper()函數(shù)會將字符串轉(zhuǎn)換成小寫大寫字符串;remove()和 insert()函數(shù)提供了刪除和插入字符串的能力;simplified()函數(shù)可以將串中的所有連續(xù)的空白字符替換成一個,并且把兩端的空白字符去除,例如" \t ”會返回一個空格" "。

將 const char *類型的 C 風(fēng)格字符串轉(zhuǎn)換成 QString 也是很常見的需求,簡單來說,QString 的+=即可完成這個功能:


str += " (1870)"; 

這里,我們將 const char 類型的字符串" (1870)"轉(zhuǎn)換成為 QString 類型。如果需要顯式的轉(zhuǎn)換,可以使用 QString 的強制轉(zhuǎn)換操作,或者是使用函數(shù) fromAscii()等。為了將 QString 類型轉(zhuǎn)成 const char 字符串,需要進(jìn)行兩步操作,一是使用 toAscii()獲得一個 QByteArray 類型對象,然后調(diào)用它的 data()或者 constData()函數(shù),例如:


printf("User: %s\n", str.toAscii().data()); 

為了方便使用,Qt 提供了一個宏 qPrintable(),這個宏等價于 toAscii().constData(),例如:


printf("User: %s\n", qPrintable(str)); 

我們調(diào)用 QByteArray 類上面的 data()或者 constData()函數(shù),將獲得 QByteArray 內(nèi)部的一個const char*類型的字符串,因此,我們不需要擔(dān)心內(nèi)存泄漏等的問題,Qt 會替我們管理好內(nèi)存。不過這也暗示我們,注意不要使用這個指針太長時間,因為如果 QByteArray 被 delete,那么這個指針也就成為野指針了。如果這個 QByteArray 對象沒有被放在一個變量中,那么當(dāng)語句結(jié)束后,QbyteArray 對象就會被 delete,這個指針也就被 delete 了。

本文出自 “豆子空間” 博客,請務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/193918

上一篇:文本文件讀寫下一篇:組件布局