QT(1)- QString
1 簡介
在Qt中表示字符串的類是QString類,它存儲字符串是采用的Unicode碼,編碼方式是使用UTF-16來進行編碼的,也就是一個字符(兩個字節
),一個中文漢字一般情況下是兩個字節。
1.1 隱式共享
QString類采用了隱式共享的機制,那什么是隱式共享呢?
隱式共享:就是最大化資源的有效利用和最小化復制克隆操作。它是一種對象的管理方法(由隱式共享類所創建的對象),當對象作為函數參數傳遞的時候,不僅安全而且效率很高,因為傳遞的時候只是傳遞的該對象的指針,數據本身只當自己被修改的時候才會去復制。簡稱寫時復制。數據相同時,執行淺拷貝,僅復制指向數據塊(包括引用計數器和真實數據)的指針,數據不同時則執行深拷貝。隱式共享技術可以大大降低對內存的開銷及CPU資源的消耗,很大程度提高應用程序的運行效率。
2 函數
2.1 構造函數
QString(const QByteArray &ba)
QString(const char *str)
QString(QString &&other)
QString(const QString &other)
QString(QLatin1String str)//構造 Latin-1 字符串str的副本。
QString(int size, QChar ch)//構造一個給定大小的字符串,每個字符都設置為ch。
QString(QChar ch) //構造一個包含字符ch的大小為 1 的字符串。
QString(const QChar *unicode, int size = -1)
QString()
2.1.1 QString(const QByteArray &ba)
構造一個用字節數組ba初始化的字符串。使用fromUtf8 () 將給定的字節數組轉換為 Unicode。在第一個 0 字符處停止復制,否則復制整個字節數組。
您可以通過定義QT_NO_CAST_FROM_ASCII
何時編譯應用程序來禁用此構造函數。例如,如果您想確保所有用戶可見的字符串都通過QObject::tr (),這將很有用。
QByteArray arr = "aa\0bb";
qDebug()<<"arr="<<arr<<" length="<<arr.size();//arr=aa length=2
QString str1 = QString(arr);
QString str2 = arr;
QString str3;
str3.fromUtf8(arr);
qDebug()<<str1<<" "<<str2<<" "<<str3;//aa aa aa
2.1.2 QString(const char *str)
構造一個用 8 位字符串str初始化的字符串。使用fromUtf8 () 函數將給定的 const char 指針轉換為 Unicode。
您可以通過定義QT_NO_CAST_FROM_ASCII
何時編譯應用程序來禁用此構造函數。例如,如果您想確保所有用戶可見的字符串都通過QObject::tr (),這將很有用。
注意:定義qt_limitted_cast_from_ascii也會禁用這個構造函數,但會啟用一個QString(const char (&ch)[N])構造函數。在本例中,未定義使用非文字輸入、內嵌NUL字符或非7位字符的輸入。
2.1.3 QString(QString &&other)
移動構造一個 QString 實例,使其指向與other指向的對象相同的對象。淺拷貝
2.1.4 QString(const QString &other)
構造other的副本。
此操作需要固定時間,因為 QString 是隱式共享]的。這使得從函數返回 QString 非常快。如果共享實例被修改,它將被復制(寫時復制),這需要線性時間。深拷貝
2.1.5 QString(const QChar *unicode, int size = -1)
構造一個用QChar數組*unicode的前size個字符初始化的字符串。
如果unicode為 0,則構造一個空字符串。
如果size為負數,則假定unicode指向一個以 \0' 結尾的數組,并且它的長度是動態確定的。終止的空字符不被視為字符串的一部分。
QString 對字符串數據進行深拷貝。unicode 數據按原樣復制,如果存在,則保留字節順序標記。
QChar cc = 'e';
QChar *ch = &cc;
QString str4 = QString(ch);
qDebug()<<str4;//亂碼,未指定長度,默認當數組處理,直至復制到\0
QChar rr[4]={'a','b','c','\0'};
QChar *sr = rr;
QString str5 = QString(sr);
qDebug()<<str5;//abc
2.2 增加函數
2.2.1 append prepend
append向后追加
QByteArray arr = "hello ";
QString temp = "word ";
QChar ch = '!';
QChar chArr[6] = {'T','o','d','a','y',' '};
const char *charArr = "is very";
QString temp2 = " good";
QStringRef ref = QStringRef(&temp2,0,5);
QString str;
str.append(arr);//拼接QByteArray類型
str.append(temp);//拼接QString類型
str.append(ch);//拼接QChar類型
str.append(chArr,5);//拼接指定長度的QChar *類型
str.append(charArr);//const char *
str.append(ref);//QStringRef
qDebug()<<str;//hello word !Todayis very good
QString &QString::prepend(const QString &str)
從前面插入
QString x = "ship";
QString y = "air";
x.prepend(y);
// x == "airship"
2.2.2 arg
占位填充
- 數據,長度,進制,填充字節
- 數據,長度,格式,精度,填充字節
- 數據,長度,填充字節
qDebug()<<QString("%1").arg(0x16,20,16,QChar('0'));//00000000000000000016
qDebug()<<QString("%1").arg(0x16,20,10,QChar('0'));//00000000000000000022
qDebug()<<QString("%1").arg(1.5,6,'g',3,'0');//數據,長度,格式,精度,填充字節
qDebug()<<QString("%1").arg(QString("hello"));//helo
qDebug()<<QString("%1").arg(QChar('a'),10,QChar('0'));//000000000a
QString str;
str = "%1 %2";
str.arg("%1f", "Hello"); // returns "%1f Hello"
str.arg("%1f").arg("Hello"); // returns "Hellof %2"
2.2.3 +=
向后追加
QString str = "hello";
QString str2 = "word";
QString str3 = "!";
str +=str2+str3+"!!!";
qDebug()<<str;//helloword!!!!
2.2.4 push_back
向后追加;可以追加字符串,也可以追加字節
QString str = "hello";
str.push_back("word");
str.push_back('!');
qDebug()<<str;//helloword!
2.2.5 leftJustified
QString QString:: leftJustified (int width, QChar fill = QLatin1Char(' '), bool truncate = false) const
返回一個大小為寬度的字符串,其中包含由填充字符填充的此字符串。
如果truncate是false
并且字符串的size () 大于width,則返回的字符串是字符串的副本。
如果truncate是true
并且字符串的size () 大于width ,則刪除位置width之后的字符串副本中的任何字符,并返回副本
QString str = "aGsdd";
qDebug()<<str.leftJustified(6,'c');//aGsddc
qDebug()<<str.leftJustified(4,'c',false);//aGsdd
qDebug()<<str.leftJustified(4,'c',true);//aGsd
2.2.6 repeated
QString QString::repeated(int times) const
返回重復指定次數的此字符串的副本。
如果times小于 1,則返回一個空字符串。
例子:
QString str( "ab" );
str.repeated(4);// 返回“abababab”
2.3刪除函數
2.3.1 chop
從字符串末尾刪除n個字符。
如果n大于或等于size(),則結果為空字符串;如果n是負數,它就等于過零。
無返回
QString str = "hello00";
str.chop(2);
qDebug()<<str;//helloA
2.3.2 chopped
返回一個子字符串,該子字符串包含該字符串的最左邊的size()-len字符。
注意:如果len為負數或大于size(),則行為未定義。
返回QString
QString str = "hello00";
qDebug()<<str.chopped(2);//hello
2.3.3 clear
清空字符串,無返回
2.3.4 remove
- QString &QString::remove(int position, int n)
從指定位置刪除n個字節
- QString &QString::remove(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive)
刪除字符串中的str(QChar,QString,QRegExp(正則表達式))
2.4查詢函數
2.4.1 at
查詢指定位置的字符
QString str = "hello";
qDebug()<<str.at(0);//h
2.4.2 front back
front返回字符串最前面一個字符
QString str = "sddd";
qDebug()<<str.front();//s
back返回字符串最后一個字符
QString str = "hello";
qDebug()<<str.back();//o
2.4.3 contains
如果此字符串包含字符串str出現,則返回true;否則返回false。
如果cs是Qt::CaseSensitive(默認),則搜索是區分大小寫的;否則,搜索不區分大小寫。
QString str = "hello word! Today is very good!";
qDebug()<<QString(str.contains("hello")?"yes":"no");//yes
qDebug()<<QString(str.contains('h')?"yes":"no");//yes
qDebug()<<QString(str.contains('p')?"yes":"no");//no
2.4.4 compare
從詞法上比較此字符串與另一個字符串,如果此字符串小于、等于或大于另一個字符串,則返回小于、等于或大于零的整數。
QString str1 = "a";
QString str2 = "A";
qDebug()<<str1.compare(str2);
2.4.5 count
返回字符串str在此字符串中出現的次數(可能重疊)。
如果cs是Qt::CaseSensitive(默認),則搜索是區分大小寫的;否則,搜索不區分大小寫。
QString str1 = "addaa";
qDebug()<<str1.count("a");//3
qDebug()<<str1.count('a');//3
2.4.6 endsWith
如果字符串以s結尾返回true;否則返回false。
如果cs是Qt::CaseSensitive(默認),則搜索是區分大小寫的;否則,搜索不區分大小寫。
QString str = "Bananas";
str.endsWith("anas"); // returns true
str.endsWith("pple"); // returns false
2.4.7 startsWith
如果字符串以str開頭,則返回true;否則返回false。
如果cs是Qt::CaseSensitive(默認),則搜索是區分大小寫的;否則,搜索不區分大小寫。
QString str = "Bananas";
qDebug()<<str.startsWith("Bana"); // returns true
qDebug()<<str.startsWith("pple"); // returns false
2.4.8 indexof
int QString::indexOf(const QString &str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
返回此字符串中字符串str第一次出現的索引位置,從的索引位置向后搜索。如果沒有找到str,返回-1。
如果cs是Qt::CaseSensitive(默認),則搜索是區分大小寫的;否則,搜索不區分大小寫。
QString str = "sdsdd";
qDebug()<<str.indexOf("s",1);//2
qDebug()<<str.indexOf('s');//0
2.4.9 lastIndexOf
int QString::lastIndexOf(const QString &str, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
返回字符串(QChar)str在此字符串中最后一次出現的索引位置,從索引位置從向前搜索。如果from是-1(默認),則從最后一個字符開始搜索;如果from是-2,則在最后一個字符的旁邊,依此類推。如果沒有找到str,返回-1。
2.4.10 left right
QString QString::left(int n) const
返回包含字符串最左邊n個字符的子字符串。
如果n大于或等于size(),或小于零,則返回整個字符串。
QString x = "Pineapple";
QString y = x.left(4);
QString s = x.right(4);
qDebug()<<y<<s;//"Pine" "pple"
2.5 修改函數
2.5.1 fill
將字符串中的每個字符設置為字符ch。如果size不等于-1(默認值),則字符串的大小將預先調整為size。
QString str = "s";
str.fill('d',3);
qDebug()<<str;//ddd
2.5.2 insert
insert(int position, const QString &str)
在指定的位置插入字符串(QChar,QByteArry,const char*,QStringRef)
2.5.3 replace
QString & | replace(int position, int n, const QString &after) | 從position位置開始向后的n個字節作為一整個字符串,被替換成after |
---|---|---|
QString & | replace(int position, int n, QChar after) | 從position位置開始向后的n個字節作為一整個字符串,被替換成after |
QString & | replace(int position, int n, const QChar *unicode, int size) | 從position位置開始向后的n個字節作為一整個字符串,被替換成指定大小的unicode |
QString & | replace(QChar before, QChar after, Qt::CaseSensitivity cs = Qt::CaseSensitive) | 所有的befor被替換成after |
2.5.4 resize
將字符串的大小設置為字符大小。
如果size大于當前的大小,則擴展字符串,使其具有大小字符長,并將額外的字符添加到末尾。新字符未初始化。
如果size小于當前大小,字符將從末尾刪除。
QString s = "Hello world";
s.resize(5);
// s == "Hello"
s.resize(8);
// s == "Hello???" (where ? stands for any character)
2.5.6 section
此字符串被視為由字符sep分隔的字段序列。返回的字符串由從位置開始到位置結束的字段組成。如果未指定 end,則包括從位置start到字符串結尾的所有字段。字段編號為 0、1、2 等,從左數起,-1、-2 等,從右到左數。
flags參數可用于影響函數行為的某些方面,例如是否區分大小寫、是否跳過空字段以及如何處理前導和尾隨分隔符
QString str = "/section/inu/dd/eee/ddd";
qDebug()<<str.section('/',2,2);//inu
qDebug()<<str.section('/',2,3);//inu/dd
QString::SectionFlag flag = QString::SectionSkipEmpty;
qDebug()<<str.section('/',2,3,flag);//dd/eee
2.6 判斷函數
2.6.1 isLower isUpper
bool QString::isLower() const
如果字符串為小寫,則返回true,也就是說,它與tollower()折疊相同。
QString str = "aGsdd";
qDebug()<<str.isLower();//false
bool QString::isUpper() const
如果字符串為大寫,則返回true
2.6.2 isEmpty isNull
bool QString::isEmpty() const
QString().isEmpty(); // returns true
QString("").isEmpty(); // returns true
QString("x").isEmpty(); // returns false
QString("abc").isEmpty(); // returns false
bool QString::isNull() const
QString().isNull(); // returns true
QString("").isNull(); // returns false
QString("abc").isNull(); // returns false
2.6.3 isRightToLeft()
bool QString::isRightToLeft() const
如果從右向左讀取字符串,則返回true。
2.7 轉換函數
2.7.1 setNum
QString &QString:: setNum ( int n , int base = 10)
將整數按照相應的進制轉換成字符串
QString &QString:: setNum (double n, char format = 'g', int precision = 6)
將小數按照給定的格式和精度打印到字符串中