QT中字符串的轉化與拼接+QString 截取分割字符串

先說幾個相關的類:

一 、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 類作爲參數的地方,都可以安全地使用 QChar 對象或普通的字符串。
 

判斷 :

       可以用下面的成員函數判斷 QString 對象是否爲空字符串:

 

       bool isEmpty() const;    // 判斷是否爲空字符串  
 轉換:         這些函數能夠解析 QString 對象的內容,將其轉換爲相應的數值。其中 ok 參數指向一個 bool 型變量, 這個參數用於輸出轉換是否成功的信息。base參數則是轉換爲整數類型時的基。這些函數都不會改變 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()。



QString 截取分割字符串

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/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章