Qt中 QString,QByteArray,Qchar,const char* ,char *int 的用法及相互轉換
今天要說的是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 了。
--------------------------------------------------------------各種型別之間的轉換-----------------------------------------------------------------------------
1 char * 與 const char *的轉換
char *ch1="hello11";
const char *ch2="hello22";
ch2 = ch1;//不報錯,但有警告
ch1 = (char *)ch2;
2 char 轉換為 QString
其實方法有很多中,我用的是:
char a='b';
QString str;
str=QString(a);
3 QString 轉換為 char
方法也用很多中
QString str="abc";
char *ch;
ch = str.toLatin1.data();
4 QByteArray 轉換為 char *
char *ch;//不要定義成ch[n];
QByteArray byte;
ch = byte.data();
5 char * 轉換為 QByteArray
char *ch;
QByteArray byte;
byte = QByteArray(ch);
6 QString 轉換為 QByteArray
QByteArray byte;
QString string;
byte = string.toAscii();
7 QByteArray 轉換為 QString
QByteArray byte;
QString string;
string = QString(byte);
這裡再對這倆中型別的輸出總結一下:
qDebug()<<"print";
qDebug()<<tr("print");
qDebug()<<ch;(ch 為char型別)
qDebug()<<tr(ch);
qDebug()<<byteArray;(byteArray是QByteArray型別)
qDebug()<<tr(byteArray);
qDebug()<<str;(str 為Qstring型別)
但是qDebug()<<tr(str);是不可以的,要想用tr()函式輸出QString型別的字元則要如下:
qDebug()<<tr(str.toLatin1);
8 int 轉 QString
int a=10;
QString b;
b=QString::number(a)
9 QString 轉int
QString a="120"
int b;
b=a.toInt()
10 char * 與 const char *的轉換
char *ch1="hello11";
const char *ch2="hello22";
ch2 = ch1;//不報錯,但有警告
ch1 = (char *)ch2;
11 char 轉換為 QString
其實方法有很多中,我用的是:
char a='b';
QString str;
str=QString(a);
12 QString 轉換為 char
方法也用很多中
QString str="abc";
char *ch;
ch = str.toLatin1.data();
13 QByteArray 轉換為 char *
char *ch;//不要定義成ch[n];
QByteArray byte;
ch = byte.data();
14 char * 轉換為 QByteArray
char *ch;
QByteArray byte;
byte = QByteArray(ch);
15 QString 轉換為 QByteArray
QByteArray byte;
QString string;
byte = string.toAscii();
16 QByteArray 轉換為 QString
QByteArray byte;
QString string;
string = QString(byte);
這裡再對這倆中型別的輸出總結一下:
qDebug()<<"print";
qDebug()<<tr("print");
qDebug()<<ch;(ch 為char型別)
qDebug()<<tr(ch);
qDebug()<<byteArray;(byteArray是QByteArray型別)
qDebug()<<tr(byteArray);
qDebug()<<str;(str 為Qstring型別)
但是qDebug()<<tr(str);是不可以的,要想用tr()函式輸出QString型別的字元則要如下:
qDebug()<<tr(str.toLatin1);
17 int 轉 QString
int a=10;
QString b;
b=QString::number(a)
18 QString 轉int
QString a="120"
int b;
b=a.toInt()
--------------------------------------------------------------------
1 QString --> string
QString.toStdString();
2 string --> QString
QString::fromStdString(string)
3 QString --->int,double,char *
QString::toInt()
QString::toDouble()
QString.toStdString().c_str();
4 int double char* --->string
可以採用<sstream>裡的stringstream
以int 為例,int a = 3;
stringstream ss;
string strInt;
ss<<a;
ss>>strInt;
其他兩個一樣。
5 int double char*轉QString
一種方法可以先轉string,再轉QString。
另一種方法可以檢視QString類的函式。
其一:靜態函式 QString number ( double n, char format = 'g', int precision
= 6 )
其二:非靜態函式,需構造QString例項來呼叫的 QString & setNum ( double n, char format =
'g', int precision = 6 )
QString::number()這個靜態函式,引數可以是int,也可以是double。
6 double int的互轉
可採用static_cast
相關文章
- QT中QString轉const char *的問題QT
- C++中string、char *、char[]、const char*的轉換C++
- char轉換成int
- const char*, char const*, char*const的區別
- C++中char* const char* string 之間的轉換複習C++
- const char*, char const*, char*const 有何區別?
- 怎樣把QString轉換為char *或者相反?
- string與char陣列相互轉換陣列
- CString,int,string,char*之間的轉換
- QString與QByteArray互相轉換的方法
- 關於QString轉換為char*的一點小細節
- const char*的全特化
- MySQL中int、char、varchar的效能淺談MySql
- char型別的數值轉換型別
- char(16)列的資料轉換
- oracle中ascii函式及to_char函式使用及編碼間的轉換OracleASCII函式
- oracle中函式to_char()的用法介紹Oracle函式
- const char* 型別不能用於初始化char* 型別實體型別
- C++中char*與wchar_t*之間的轉換C++
- VS編譯器基礎 int main(int argc,char* argv[])編譯AIGC
- 【char* 字元指標的用法】及【輸出NULL的問題】字元指標Null
- VS C++ 2017中const char* 型別的值不能用於初始化char*的解決C++型別
- to_char函式格式轉換參考函式
- ABAP中Char型別資料轉換成Decimal型別型別Decimal
- delphi:string,PChar,Array of Char 之間的轉換
- 【C++】CONST CHAR*型別的值不能用於初始化CHAR*型別的實體C++型別
- 關於VS2017中const char *不能用於初始化char *型別的實體的問題型別
- JNI - 如何將 char 轉換成 jstringJS
- char str[]和char *str的區別
- object-c中NSString與int和float的相互轉換Object
- oracle進位制轉換to_number_to_char_bin_to_numOracle
- C,C++中如何向main(int argc , char argv[])傳遞引數C++AIGC
- char *的使用
- E0144 "const char *" 型別的值不能用於初始化 "char *" 型別的實體型別
- char[] 轉換string時的自動截斷問題
- Oracle中的時間函式用法(to_date、to_char) (總結)Oracle函式
- char* 轉 LPCWSTR 解決方案
- 不能將引數 2 從“char [8]”轉換為“LPCWSTR”