青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

Qt中的QString,QByteArray,Qchar, char*

Posted on 2011-06-01 21:42 RTY 閱讀(1342) 評論(0)  編輯 收藏 引用 所屬分類: Qt轉載隨筆
先要說的是QString。
      之所以把QString單獨拿出來,是因為string是很常用的一個數據結構,甚至在很多語言中,比如JavaScript,都是把string作為一種同int等一樣的基本數據結構來實現的。
      每一個GUI程序都需要string,這些string可以用在界面上的提示語,也可以用作一般的數據結構。C++語言提供了兩種字符串的實現:C風格的 字符串,以'\0‘結尾;std::string,即標準模版庫中的類。Qt則提供了自己的字符串實現:QString。QString以16位 Uniode進行編碼。我們平常用的ASCII等一些編碼集都作為Unicode編碼的子集提供。關于編碼的問題,我們會到以后的時候再詳細說明。
在使用QString的時候,我們不需要擔心內存分配以及關于'\0'結尾的這些注意事項。QString會把這些問題解決。通常,你可以把 QString看作是一個QChar的向量。另外,與C風格的字符串不同,QString中間是可以包含'\0'符號的,而length()函數則會返回 整個字符串的長度,而不僅僅是從開始到'\0'的長度。
     同Java的String類類似,QString也重載的+和+=運算符。這兩個運算符可以把兩個字符串連接到一起,正像Java里面的操作一樣。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()。
使用static的函數number()可以把數字轉換成字符串。例如:
QString str = QString::number(54.3); 
你也可以使用非static函數setNum()來實現相同的目的:
QString str;  
str.setNum(54.3); 
而一系列的to函數則可以將字符串轉換成其他基本類型,例如toInt(), toDouble(), toLong()等。這些函數都接受一個bool指針作為參數,函數結束之后將根據是否轉換成功設置為true或者false:
bool    ok;  
double    d = str.toDouble(&ok);  
if   (ok)  
{  
    // do something...   
} else    {  
    // do something...   
對于QString,Qt提供了很多操作函數,例如,使用mid()函數截取子串:
QString x   = "Nine pineapples"  ;  
QString y   = x  .mid(5, 4);            // y   == "pine"  
QString z   = x  .mid(5);               // z   == "pineapples" 
mid()函數接受兩個參數,第一個是起始位置,第二個是取串的長度。如果省略第二個參數,則會從起始位置截取到末尾。正如上面的例子顯示的那樣。
函數left()和rigt()類似,都接受一個int類型的參數n,都是對字符串進行截取。不同之處在于,left()函數從左側截取n個字符,而right()從右側開始截取。下面是left()的例子:
QString x = "Pineapple"  ;  
QString y = x.left(4);      // y == "Pine"   
函數indexOf()返回字符串的位置,如:
QString x = "sticky question"  ;  
QString y = "sti"  ;  
x.indexOf(y);               // returns 0   
x.indexOf(y, 1);            // returns 10   
x.indexOf(y, 10);           // returns 10   
x.indexOf(y, 11);           // returns -1   
函數startsWith()和endsWith()可以檢測字符串是不是以某個特定的串開始或結尾,例如:
if    (url.startsWith("http:"  ) && url.endsWith(".png"  ))  
{  
這段代碼等價于
if    (url.left(5) == "http:"   && url.right(4) == ".png"  )  
{  
不過,前者要比后者更加清楚簡潔,并且性能也更快一些。
QString還提供了replace()函數供實現字符串的替換功能;trimmed()函數去除字符串兩側的空白字符(注意,空白字符包括空 格、Tab以及換行符,而不僅僅是空格);toLower()和toUpper()函數會將字符串轉換成小寫大寫字符串;remove()和 insert()函數提供了刪除和插入字符串的能力;simplified()函數可以將串中的所有連續的空白字符替換成一個,并且把兩端的空白字符去 除,例如"   \t   ”會返回一個空格" "。
將const char *類型的C風格字符串轉換成QString也是很常見的需求,簡單來說,QString的+=即可完成這個功能:
str += " (1870)"  ; 
這里,我們將const char * 類型的字符串" (1870)"轉換成為QString類型。如果需要顯式的轉換,可以使用QString的強制轉換操作,或者是使用函數fromAscii()等。為了 將QString類型轉成const char *字符串,需要進行兩步操作,一是使用toAscii()獲得一個QByteArray類型對象,然后調用它的data()或者constData()函 數,例如:
printf("User: %s\n"  , str.toAscii().data()); 
為了方便使用,Qt提供了一個宏qPrintable(),這個宏等價于toAscii().constData(),例如:
printf("User: %s\n"  , qPrintable(str)); 
我們調用QByteArray類上面的data()或者constData()函數,將獲得QByteArray內部的一個const char*類型的字符串,因此,我們不需要擔心內存泄漏等的問題,Qt會替我們管理好內存。不過這也暗示我們,注意不要使用這個指針太長時間,因為如果 QByteArray被delete,那么這個指針也就成為野指針了。如果這個QByteArray對象沒有被放在一個變量中,那么當語句結束 后,QbyteArray對象就會被delete,這個指針也就被delete 了。
接下來說說QString和QByteArray之間的轉換  ,這里說兩種,都是從網上搜到的。
第一種,數據流的方式,這里只說從QByteArray轉向QString。
QByteArray encodedString = "xxx";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QString string = codec->toUnicode(encodedString);
[另外]
char ch_str[10] = "搜索";
QString str = QString::fromLocal8Bit(ch_str);
第二種,常用的,網上看到的。
//常用參數類型:char *字符串, QByteArray字符數組, QString字符串
//需要轉換:char * ---轉---  QByteArray  ---需要調用QByteArray類的構造函數
char*     --------------QByteArray(const char*)-----------> QByteArray
char* str;
QByteArray byte(str);
char*     --------------QString(const char*)-------------->QString
char* str;
QString string(str);
QByteArray   -------------data()-------------------->char*
QByteArray byte;
char* str = byte.data();
QByteArray  ------------QString()------------------->QString
QByteArray byte;
QString string(byte);
QString  --------------toAscii()--------------------> QByteArray
QString string;
QByteArray byte = string.toAscii();
QString -------------qPrintable()------------------>char*
QString string;
char* str = qPrintable(string);
或QString --------toLatin1()------QByteArray----------data()--------->char*
QString string;
QByteArray ba=string.toLatin1();
const char* str = ba.data();
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品在线免费| 日韩一区二区免费高清| 国产欧美日本在线| 99这里只有精品| 欧美成人精品h版在线观看| 午夜精品福利一区二区蜜股av| 欧美激情一区二区三区高清视频 | 国产在线不卡视频| 亚洲欧洲99久久| 亚洲一区二区精品| 国产欧美视频一区二区| 欧美专区中文字幕| 欧美在线免费播放| 伊人成人在线视频| 欧美激情亚洲| 欧美日韩成人激情| 午夜视频精品| 欧美午夜精品久久久久久浪潮| 亚洲伦理久久| 欧美激情一区二区三区在线视频| 久久男人av资源网站| 精品av久久707| 女人香蕉久久**毛片精品| 欧美一区网站| 久久一二三国产| 欧美日韩一区二区欧美激情 | 国产精品久久久久久av福利软件| 亚洲大胆人体在线| 老司机精品视频网站| 午夜精品久久久久久久男人的天堂 | 欧美二区乱c少妇| 久久精品二区三区| 黄色成人av| 久久亚洲精品伦理| 久久中文字幕一区二区三区| 欧美手机在线视频| 伊人成年综合电影网| 亚洲综合99| 久久久久久久一区| 最新中文字幕一区二区三区| 亚洲大片一区二区三区| 久久在线视频在线| 日韩亚洲欧美成人一区| 一区二区三区四区国产精品| 国产精品久久久久久久久免费 | 欧美在线视频免费| 免费日韩av电影| 久久九九99| 亚洲成色最大综合在线| 欧美黄色免费网站| 欧美日韩在线另类| 午夜在线精品偷拍| 性欧美激情精品| 亚洲电影在线免费观看| 亚洲国产三级| 亚洲第一搞黄网站| 欧美日韩精品免费观看| 欧美在线免费看| 猛干欧美女孩| 午夜精品久久久久久| 久久夜色精品国产欧美乱| 一本色道88久久加勒比精品| 亚洲综合三区| 亚洲国产精品一区二区三区| 99精品欧美一区| 伊人久久婷婷| 亚洲性视频网址| 国产欧美日韩一区| 久久亚洲一区二区| 欧美日韩视频免费播放| 久久久欧美一区二区| 欧美日韩亚洲综合在线| 老色鬼久久亚洲一区二区| 欧美精品色综合| 久久电影一区| 欧美精品日韩www.p站| 久久久久久久一区二区| 欧美激情亚洲| 欧美aⅴ一区二区三区视频| 国产精品剧情在线亚洲| 欧美大片免费久久精品三p | 蜜桃视频一区| 久久精品日韩欧美| 欧美午夜不卡视频| 91久久综合亚洲鲁鲁五月天| 国产一区二区精品丝袜| 亚洲精品自在久久| 亚洲第一区中文99精品| 性欧美大战久久久久久久免费观看| 一本大道久久精品懂色aⅴ| 久久精品91久久香蕉加勒比| 亚洲直播在线一区| 欧美老女人xx| 免费短视频成人日韩| 久久婷婷成人综合色| 夜夜嗨av一区二区三区| 亚洲永久免费观看| 亚洲免费成人av| 免费欧美在线| 你懂的国产精品| 韩日欧美一区二区三区| 亚洲欧美日韩综合| 亚洲在线观看| 欧美性大战久久久久久久| 91久久精品一区二区别| 好吊日精品视频| 欧美一区日韩一区| 久久九九有精品国产23| 国产精品一卡二| 午夜精品短视频| 欧美在线视频二区| 国产伪娘ts一区| 欧美成人一区在线| 亚洲欧美中文字幕| 欧美在线观看一区| 欧美日韩综合网| 欧美福利视频在线| 国产一本一道久久香蕉| 欧美福利视频在线观看| 亚洲国产精品热久久| 亚洲丁香婷深爱综合| 伊人久久婷婷| 亚洲日韩第九十九页| 欧美激情综合五月色丁香| 久久国产一二区| 欧美不卡高清| 欧美日韩亚洲高清一区二区| 国产日韩欧美在线| 亚洲理伦在线| 国产精品视频网站| 亚洲美洲欧洲综合国产一区| 亚洲第一区在线观看| 狠狠色丁香久久综合频道| 一区二区三区日韩在线观看| 欧美韩日一区| 欧美激情精品久久久久久免费印度 | 亚洲综合第一| 国产精品一区二区三区久久 | 美腿丝袜亚洲色图| 91久久在线播放| 亚洲专区免费| 国产精品久久久久久模特| 欧美黄色免费网站| 亚洲激情视频网| 欧美日韩中文字幕精品| 新片速递亚洲合集欧美合集| 欧美电影免费观看高清| 在线亚洲精品| 狠狠色狠狠色综合人人| 欧美久久久久久久久久| 亚洲欧美视频在线观看| 欧美高清成人| 久久xxxx精品视频| 亚洲美女福利视频网站| 国产精品一区二区a| 麻豆成人精品| 午夜电影亚洲| 亚洲精品乱码| 久久这里有精品视频| 日韩亚洲欧美精品| 伊人精品成人久久综合软件| 欧美午夜精品伦理| 欧美成人精品h版在线观看| 午夜精品久久久久久久男人的天堂| 欧美福利电影在线观看| 久久成人精品视频| 一区二区欧美视频| 一本色道婷婷久久欧美| 亚洲福利视频网站| 国产日韩欧美电影在线观看| 欧美日韩亚洲一区二区| 久久婷婷丁香| 亚洲欧美成人网| 免费看亚洲片| 亚洲一区二区高清视频| 国产一区二区精品丝袜| 麻豆成人精品| 亚洲午夜激情网站| 欧美www在线| 亚洲视频精选在线| 国产日韩精品一区| 欧美剧在线免费观看网站| 亚洲韩国日本中文字幕| 在线免费观看日本欧美| 午夜亚洲性色福利视频| 国产一区二区三区高清| 欧美日韩免费观看一区=区三区| 在线综合视频| 麻豆国产精品777777在线| 久久久人人人| 玖玖综合伊人| 国产精品多人| 国产精品国产三级国产专播精品人| 欧美精品免费播放| 欧美日韩视频第一区| 欧美日韩视频| 国产精品卡一卡二| 国产一区二区三区高清播放| 国产美女精品免费电影| 国产日韩欧美一区在线|