1. 程式人生 > >QString類的詳細用法

QString類的詳細用法

介紹

QString 類是 Qt 中用於實現對字串操作的類,與 std::string 用法類似.它在實現上有以下特徵:

  1. 字串內部採用 Unicode(utf-16) 編碼,可以表示世界上大多數語言的文字。
  2. QString類採用隱式共享技術,將深拷貝和淺拷貝有機地結合起來。(有關淺拷貝,深拷貝等知識:請看)

相關的類

  1. QChar:表示一個Unicode編碼的字元,詳細用法:請看
  2. QByteArray:相當於是QChar的一個vector<>,詳細用法:請看
  3. QStringRef:是對QString一部分的一個引用,作了一些優化,詳細用法:請看
  4. QStringList:是QList的派生類,是字串的列表類,非常有用,詳細用法:
    請看
  5. QRegExp:對於正則表示式提供了豐富的操作,詳細用法:請看
  6. QTextCodec:提供QString與不同編碼的字串之間的轉換,詳細用法:請看

常見用法

  • 構造。QString提供了多種構造方式,很方便。如:
Qstring();                                       // 構造null字串
QString(QChar ch);                               // 由 QChar物件ch構造  
QString(const QChar *unicode, int size = -1);    // 由QChar陣列構造,size是陣列大小
QString(const QByteArray & ba); // 由QbyteArray構造 QString(const QString &other); // 拷貝建構函式 QString(const char *str); // 由c風格字串 str 構造
  • 數值轉化。QString 類提供了很多函式用於字串與數值之間的相互轉換,類似於C標準庫stdlib.h中的 atoi() , itoa()等函式…

//str -> num    ok的作用是輸出轉化是否成功,base是字串所代表的整數的進位制
double toDouble(bool *ok = 0) const; // 轉換為高精度浮點數 float toFloat(bool *ok = 0) cosnt; // 轉換為浮點數 int toInt(bool *ok, int base = 10) const; // 轉換為整型數 long toLong(bool *ok, int base = 10) cosnt; // 轉換為長整型 short toShort(bool *ok, int base = 10) const; // 轉換為短整型 uint toUInt(bool *ok = 0; int base = 10) const // 轉換為無符號整型數 ulong toLong(bool *ok = 0, int base = 10) const; // 轉換為無符號長整型數 ushort toUShort(bool *ok = 0, int base = 10) const; // 轉換為無符號短整型數 //num -> str 將數字轉化為字串並賦給QString物件,base是轉化後的字串所代表的整數的進位制 QString &setNum(int n, int base = 10); // 整型數 QString &setNum(uint n, int base = 10); // 無符號整型數 QString &setNum(long n, int base = 10); // 長整型 QString &setNum(ulong n, int base = 10); // 無符號長整型數 QString &setNum(short n, int base = 10); // 短整型數 QString &setNum(ushort n, int base = 10); // 無符號短整型數 QString &setNum(double n, char format = 'g', int precision = 6); // 高精度浮點數 QString &setNum(float n, char format = 'g', int precision = 6); // 浮點數
  • 格式化字串。C++中用printf,sprintf等函式來格式化字串,QString中也有相應的函式來實現,如下:
// 1.QString::sprintf() ,用法和C++中的sprintf()差不多,示例如下:
QString s1 = "";
s1.sprintf("%s%d","hello",123); // s1被格式化為 "hello123" ,返回s1的引用

// 注意sprintf()的引數不能直接是QString物件(QByteArray物件也不可以),所以這樣是錯誤的:
s1.sprintf("%s%d", s1, 123);
// 正確用法是這樣
s1.sprintf("%s%d", s1.data(), 123); // QChar* 可以

//2.QString::arg(),使用 %1 %2 %3 ... 來作為要替換的位置,示例如下:

QString s1 = "pen";
QString s2 = "apple";
QString s3 = "pineapple";
QString format = "%1 + %2 = %3";    
QString s4 = format.arg(s1,s2,s3); //返回格式化後的字串,不改變格式串

//也可以分次格式化
s4 = format.arg(s1).arg(s2).arg(s3);

//感覺arg()似乎比sprintf()更好用些...
  • 查詢。在本字串上查詢是否出現了作為引數傳遞的字串或QRegExp正則表示式,用法如下:
//從前向後查詢到第一個符合條件的字串的位置,,沒有返回-1,from可指定開始查詢的位置
int indexOf(const QString & str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; 
//同上,只不過引數為QChar字元
int indexOf(QChar ch, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
//同上,引數為QRegExp正則表示式來匹配
int indexOf(const QRegExp & rx, int from = 0) const;

//與上邊對應的有反向查詢(從後向前)
int lastIndexOf(const QString & str, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
int lastIndexOf(QChar ch, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
int lastIndexOf(const QRegExp & rx, int from = -1) const;

//如果不需要位置,只需要判斷引數字串是否出現在本字串中,用以下函式:
bool contains(const QString & str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
bool contains(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
bool contains(const QRegExp & rx) const;
  • 新增,插入,替換,分割,刪除,其他。
1.新增
QString &append(const QString & str); // 向末尾新增 QString 物件
QString &append(const QChar * str, int len); //...QChar* 型字串
QString &append(const QByteArray & ba); //...QByteArray 物件
QString &append(const char * str); //...C風格字串
QString &append(char ch); //...普通字元
QString &append(QChar ch); //...QChar 字元

QString &prepend(const QString &str); // 在前面新增 QString 物件
QString &prepend(const QChar &str,int len); //...QChar* 型字串
QString &prepend(const QByteArray& ba); //...QByteArray 物件
QString &prepend(const char *str); // ...C風格字串
QString &pretend(char ch); //...普通字元
QString &prepend(QChar ch); // ...QChar 字元

//Ps:也可以用 push_back() 和 push_front() 函,或者直接用過載操作符 += 

2.插入
QString &insert(int position, const QString & str); //向指定的position位置插入一個 QString 物件
QString &insert(int position, const QChar * unicode, int size); //同上
QString &insert(int position, QChar ch); //同上

3.替換
QString &replace(int position, int n, const QString & after) //從position位置開始將原QString中的n個字元替換為after中的n個字元

QString &replace(int position, int n, const QChar * unicode, int size); //同上

QString &replace(int position, int n, QChar after); //同上

QString &replace(const QString & before, const QString & after, Qt::CaseSensitivity cs = Qt::CaseSensitive); //在原QString物件中查詢before,然後替換為after,沒找到則什麼都不做

QString &replace(const QChar * before, int blen, const QChar * after, int alen, Qt::CaseSensitivity cs = Qt::CaseSensitive); //同上

QString &replace(QChar ch, const QString & after, Qt::CaseSensitivity cs = Qt::CaseSensitive); //同上

QString &replace(QChar before, QChar after, Qt::CaseSensitivity cs = Qt::CaseSensitive); //同上

QString &replace(const QRegExp & rx, const QString & after); //在元QString中匹配正則表示式rx,然後替換為after

4.分割

//簡單分割
QString left(int n) const; // 分割得到前n個字元構成的子字串
QString right(int n) const; // 分割得到後n個字元構成的子字串
QString mid(int position, int n = -1const; // 從中間切割子字串,position是切割位置,n是長度

//根據字串或正則表示式分割
QStringList split(const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; //在原QString物件中查詢所有位置的sep,並根據sep為分割點將原QString物件分割為n個子字串,如:原QString為 "abcCUTbacCUTcab",sep為"CUT",則分割得到{"abc","bac","cab"}

QStringList split(QChar sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; //同上

QStringList split(const QRegExp & rx, SplitBehavior behavior = KeepEmptyParts) const; //同上

5.刪除
void chop(int n); //刪除後n個字元
void truncate(int position); //刪除從position後的所有字元
QString &remove(int position, int n); //從position位置處向後刪除n個字元
QString &remove(const QString & str, Qt::CaseSensitivity cs = Qt::CaseSensitive); //刪除原QString物件中出現的所有str
QString &remove(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive); //刪除原QString物件中出現的所有ch字元
QString &remove(const QRegExp & rx); //刪除原QString物件中根據正則表示式rx匹配到的所有位置

6.其他
const QChar at(int position) const; //得到某個位置的字元,也可以直接用[]
void reserve(int size); //重新設定QString長度,若size小於當前長度,後面的會丟失
void squeeze(); //清除多餘的沒有儲存字元的記憶體
void clear(); //清空字串
int size(); //返回字串長度
int capacity() const; //返回目前最多可以儲存的字元數
bool isNull() const; //判斷QString是否為null(還未分配記憶體空間)
bool isEmpty() const; //判斷是否為空字串( QString()既是null也是empty,而QString("")就只是empty )
QChar* date(); //返回QChar*字串
void swap(QString & other); //與另一個QString物件交換
QString trimmed() const; //返回刪除了開頭和結尾的所有空白字元的QString物件(原QString不改變)
QString simplified() const; //返回刪除了所有空白字元的QString物件(原QString不改變)
QString toLower(); //轉為小寫
QString toUpper(); //轉為大寫
  • 字符集相互轉化(Unicode,utf-8,gbk,ascii):在不同的系統下如windows下,使用vs系列編譯器時,因為原始檔是採用gbk編碼,所以直接將含中文的C風格字串(或std::string等)轉為QString會亂碼,QString提供了一系列字符集相互轉化的函式,詳細如下:
1.其他編碼不同的字串轉為QString(static函式)
QString fromLatin1(const char * str, int size = -1); //從latin1編碼(ASCII編碼的擴充)的C風格字串轉為QStirng
QString fromLatin1(const QByteArray & str); //從latin1編碼(ASCII編碼的擴充)的QByteArray轉為QStirng
QString fromLocal8Bit(const char * str, int size = -1); //從gbk編碼的C風格字串...
QString fromLocal8Bit(const QByteArray & str); //從gbk編碼的QByteArray...
QString fromRawData(const QChar * unicode, int size); //從QChar*...
QString fromStdString(const std::string & str); //從std::string(gbk編碼)...
QString fromStdU16String(const std::u16string & str); //從u16string(utf16編碼)...
QString fromStdU32String(const std::u32string & str); //從u32string(utf32編碼)...
QString fromStdWString(const std::wstring & str); //從wstring(寬位元組)...
QString fromUtf8(const char * str, int size = -1); //從utf-8編碼的C風格字串...
QString fromUtf8(const QByteArray & str); //從utf-8編碼的QByteArray...
QString fromUtf16(const ushort * unicode, int size = -1); //從utf-16編碼的ushort*...
QString fromWCharArray(const wchar_t * string, int size = -1); //wchar_t等同於ushort
QString fromUcs4(const uint * unicode, int size = -1); //從Ucs4(utf-32)編碼的uint*...

//非靜態
QString &setUnicode(const QChar * unicode, int size); //從QChar*...
QString &setUtf16(const ushort * unicode, int size); //從ushort*...

2.從QString轉為其他編碼的字串
QByteArray  toLatin1() const; //返回latin1編碼的QByteArray...
QByteArray  toLocal8Bit() const; //返回gbk編碼的QByteArray...
QByteArray  toUtf8() const; //返回utf-8編碼的QByteArray...
std::string toStdString() const; //返回std::string...
std::u16string  toStdU16String() const; //返回u16string...
std::u32string  toStdU32String() const; //返回u32string...
std::wstring  toStdWString() const; //返回wstring...
const QChar *unicode() const; //返回QChar*
  • 過載操作符:QString提供了一系列操作符方便用與 QString,C風格字串,字元等型別作 賦值,比較,相加,下標索引等操作,詳細略。

更多詳細用法請參考Qt文件:QString