先說幾個相關的類:
一 、QChar
QChar 類是 Qt 中用於表示一個字符的類,實現在 QtCore 共享庫中。QChar 類內部用2個字節的Unicode編碼來表示一個字符。
構造
QChar 類提供了多個不同原型的構造函數以方便使用,如:
實際使用時很少直接構造 QChar 類的對象,而是把這些構造函數當做類型轉換來用,讓編譯器自動構造所需的QChar類對象。也就是說,在所有需要QChar類作爲參數的地方都可以安全地使用各種整數類型。
判斷
QChar 類提供了很多成員函數,可以對字符的類型進行判斷,如:
注意這幾個函數都不會改變對象自身,轉換的結果通過返回值反映出來。
比較:
bool operator != (QChar c1, QChar c2); // 判斷 c1 是否不等於 c2
bool operator < (QChar c1, QChar c2); // 判斷 c1 是否小於 c2
bool operator <= (QChar c1, QChar c2); // 判斷 c1 是否小於等於 c2
bool operator == (QChar c1, QChar c2); // 判斷 c1 是否等於c2
bool operator > (QChar c1, QChar c2); // 判斷 c1 是否大於 c2
bool operator >= (QChar c1, QChar c2); // 判斷 c1 是否大於等於 c2
二、QString類:
QString 類是 Qt 中用於表示字符串的類,實現在 QtCore 共享庫中。QString 類在實現上有以下特徵。
1)字符串採用 Unicode 內部編碼,可以表示世界上大多數語言的文字。
2)字符串的存儲有引用計數,當一個 QString 對象被複製爲另一個 QString 對象時,它們實際上指向相同的存儲空間,僅僅是增加一個引用計數。
3)採用 “按需複製” 的技術,當指向相同存儲空間的多個 QString 對象中的一個要被修改時,將真正複製一個新的字符串並進行修改。
構造:
QString 類提供了很多不同原型的構造函數以方便使用。如:
判斷 :
可以用下面的成員函數判斷 QString 對象是否爲空字符串:
注意: 當字符串以 0x開頭時,轉換的基自動轉換爲16, 當字符串以0開頭時,轉換的基自動爲8。
還有一些將其他類型轉換成QString的方法:
使用static的函數number()可以把數字轉換成字符串。例如:
QString str = QString::number(54.3);
你也可以使用非static函數setNum()來實現相同的目的:
QString str;
str.setNum(54.3);
字符串的拼接:
一、QString可以自動的對佔用內存空間進行擴充,這種連接操作是恨迅速的。下面是這兩個操作符的使用:
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()。
Title :
- QString
- QString::section()
- QString::split()
Q :
如何從一段由特殊符號分隔的 QString 中獲取被分隔的子串?
- 從字符串“one, two, three, four”中獲取第二個由‘,’分隔的子串,即“two” ;
QString str = "one, two, three, four";
cout << str.section(',', 1, 1).trimmed().toStdString() << endl;
- 1
- 2
- 1
- 2
結果是 “two”,前後不包含空格。上面的函數 trimmed() 是去掉字符串前後的ASCII字符 ‘\t’, ‘\n’, ‘\v’, ‘\f’, ‘\r’, and ’ ‘,這些字符用QChar::isSpace()判斷都返回true。重點是 section()函數,見下面詳細。
- 從字符串 “one, two* three / four / five ^ six”中獲取第四個由 ‘,’、‘*’、 ‘/’和’^’分隔的子串,即“four”;
QString str = "one, two* three / four / five ^ six";
cout << str.section(QRegExp("[,*/^]"), 3, 3).trimmed().toStdString() << endl;
- 1
- 2
- 1
- 2
上面用到了一個簡單的正則表達式,在Qt中可以由類QRegExp構造,函數 section() 支持使用正則表達式。
重點內容
Fn 1 :
QString QString::section ( QChar sep, int start, int end = -1, SectionFlags flags = SectionDefault ) const
- 1
- 1
這個函數把字符串看成是幾個塊,這些塊由 sep 分隔,start 和 end 指定塊號,end 默認爲 –1 ,返回的是[ start, end ]內的塊組成的字符串,如果 start 和 end 都是負數,那麼將從字符串的後面往前面數,返回 [ -end, –start ]內的塊組成的字符串。SectionFlags是一些標記,如SectionSkipEmpty表示如果兩個分隔符之間是空串,那麼就會跳過。下面的代碼是摘自QtDoc 4.7:
QString str;
QString csv = "forename,middlename,surname,phone";
QString path = "/usr/local/bin/myapp"; // First field is empty
QString::SectionFlag flag = QString::SectionSkipEmpty;
str = csv.section(',', 2, 2); // str == "surname"
str = path.section('/', 3, 4); // str == "bin/myapp"
str = path.section('/', 3, 3, flag); // str == "myapp"
str = csv.section(',', -3, -2); // str == "middlename,surname"
str = path.section('/', -1); // str == "myapp"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
另外這個函數的另兩個重載函數如下:
QString QString::section ( const QString & sep, int start, int end = -1, SectionFlags flags = SectionDefault ) const
QString QString::section ( const QRegExp & reg, int start, int end = -1, SectionFlags flags = SectionDefault ) const
- 1
- 2
- 1
- 2
第二個支持正則表達式作爲分隔符判定,在某些場合下是不可替代的,如上面的問題中的第二個。
Fn 2 :
QStringList QString::split ( const QChar & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
- 1
- 1
這個函數把所有的由 sep 分隔的塊裝進一個 QStringList 中返回, 這個函數同樣有兩個重載:
QStringList QString::split ( const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
QStringList QString::split ( const QRegExp & rx, SplitBehavior behavior = KeepEmptyParts ) const
- 1
- 2
- 1
- 2
使用 split() 函數對上述兩個問題中的第二個進行求解:
QString str = "one, two* three / four / five ^ six";
QStringList sections = str.split(QRegExp("[,*/^]")); //把每一個塊裝進一個QStringList中
cout << sections.at(3).trimmed().toStdString() << endl;
- 1
- 2
- 3
- 1
- 2
- 3
End:
Author : Ggicci
多謝閱讀,有誤希望指正!
http://tmjfzy.blog.163.com/blog/static/664470252012645536321/