QT(1)- QString

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

占位填充

  1. 數據,長度,進制,填充字節
  2. 數據,長度,格式,精度,填充字節
  3. 數據,長度,填充字節
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

返回一個大小為寬度的字符串,其中包含由填充字符填充的此字符串。

如果truncatefalse并且字符串的size () 大于width,則返回的字符串是字符串的副本。

如果truncatetrue并且字符串的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

  1. QString &QString::remove(int position, int n)

從指定位置刪除n個字節

  1. 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)

將小數按照給定的格式和精度打印到字符串中

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,998評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,993評論 2 374