QString和QByteArray的用法

其余相关的类

QChar:表示一个Unicode编码的字符;
QByteArray:相当于是QChar的一个vector<>;
QStringRef:是对QString一部分的一个引用,作了一些优化;
QStringList:是QList的派生类,是字符串的列表类,非常有用;
QRegExp:对于正则表达式提供了丰富的操作,详细用法;
QTextCodec:提供QString与不同编码的字符串之间的转换 


字符串的隐式共享(浅拷贝、深拷贝)

隐式共享又称回写复制。
1、当两个对象共享同一份数据(通过浅拷贝实现数据块的共享)时,如果数据不改变,则不进行数据的复制(浅拷贝,引用)。
2、而当某个对象需要改变数据时,则进行深拷贝(堆中开辟空间)。

Qt中支持隐式共享的类,还包括:
1、所有的容器类。
2、QString、QByteArray、QBrush、QPen、QPalette、QBitmap、QImage、QPixmap、QCursor、QDir、QFont和QVariant等。

 /******** 浅拷贝、深拷贝 ******/

// 堆中开辟空间存储"data",str1指向该地址,该数据结构引用计数为1
QString str1 = "data"; 

//浅拷贝,str2 指向 str1中指向的地址 ,str1指向的数据结构引用计数为2
QString str2 = str1;   

//深拷贝,堆存中开辟新的空间,存储“dsta”,str2指向 “dsta” 的地址, 引用计数为1; str1指向"data"地址 ,引用计数为1;
str2[1] = 's';  

//无复制,仅对 str2指向的数据结构内容进行修改"bsta"
str2[0] = 'b'; 

//   原 str1指向的数据结构("data")的引用计数 计0,内存空间被释放; str1指向str2所指向的地址,该地址引用计数为2
str1= str3;  


QString类介绍

详细参见QString类的详细用法
QString类存储Unicode 字符串(UTF-16编码),QString字符串中能嵌入'\0'字符,length()函数返回整个字符串的大小,包括嵌入的'\0'字符。

QString转Qchar时,需先转换成QByteArray。

常用字符串函数如下:

1、字符串拼接

    ".prepend()"添加前缀
    “.append()” 添加尾缀
     push_back()、 push_front()、 或者直接用重载操作符 " += "。

QByteArray str = "data";   

str.prepend("front ");    // 添加前缀, "front data"
str.append(" tail");    // 添加后缀,“data tail”
str  += “ tail”;    // “data tail” 


2、组合字符串

  (1)".sprintf()"

QString str;
str.sprintf("Value = %s,%.1f%%", "Val", 90.2);     // "Value = Val,90.2%"

  (2)".arg()"

QString str;
str = QString ("Value =%1 , %2 ").arg("aa").arg("123");    //"Value = aa , 123"


3、字符串转数字

 (1)使用静态函数QString::number()

str = QString::number(12.4);

(2)".setNum()"

str.setNum(12.4);


4、数字转字符串

   使用toInt(), toLongLong(), toDouble()…等函数

QString str = "12";
int i = str.toInt();


5、提取字符串

(1)".mid(int pos, int len)" 

        返回【从pos起长度为len】的字符串。

QString str = "white man";
QString str2 = str.mid(6);    // "ma"

(2) ".mid(int pos)"

        返回【从pos起到字符串结尾】的字符串。

QString str = "white man";
QString str2 = str.left(5);    // "man"

(3) ".left(int len)"

        返回【最前面 长度为len】的字符串。

QString str = "white man";
QString str2 = str.left(5);   // "white"

(4)  ".right(int len)"

        返回【最后面 长度为len】的字符串。

QString str = "white man";
 QString str2 = str.right(3);   // " man"


6、判断是否包含某字符串

    ".indexOf()"

第一个参数为【待检字符串 / 字符】;第二个参数为【起始位置】,默认从0字节开始检索。
检索成功返回字节起始位置值,检索失败返回 -1。

QString str = "white man";
 int i = str.indexOf("man");    // i = 6
 int ii = str.indexOf("ba");    // ii = -1  


7、判断字符串是否以某字符(串)开始或者结束

(1)"startsWith()"

检查字符串是否以【字符串 / 字符】开始,成功则返回true,失败则返回false。

QString str="http:www.baidu.com";
int i =str.startsWith("http:");    // " i = 1 "

(2)"endsWith()"

检查字符串是否以【字符串 / 字符】结尾,成功则返回true,失败则返回false。

QString str="http:www.baidu.com";
int i =str.startsWith("cn");    // " i = 0 "


QByteArray类介绍

QByteArray类存储char型字符。

/***** QByteArray数组   定义与赋值****/
QByteArray ba;
ba.size(5);     //size()大小,不包含‘\0’; qstrlen()包含'\0'
ba[0] = 0x3e;
ba[2] = 0x01;
ba[3] = 0x00;
ba[4] = 0xff;

 /******** 浅拷贝、深拷贝 ******/
 // 堆中开辟空间存储"data",str1指向该地址,该数据结构引用计数为1 
QByteArray str1 = "data"; 
  
  //浅拷贝,str2 指向 str1中指向的地址 ,str1指向的数据结构引用计数为2
QByteArray str2 = str1;   

 //深拷贝,堆存中开辟新的空间,存储“dsta”,str2指向 “dsta” 的地址, 引用计数为1; str1指向"data"地址 ,引用计数为1;
str2[1] = 's';  

//无复制,仅对 str2指向的数据结构内容进行修改"bsta"
str2[0] = 'b';  

/************ 访问数组 *********/  
for( int i = 0 ; i < ba.size() ; i++ )
{
    if ( ba.at( i ) >=  ' a ' &&  ba.at( i ) <= ' z '  )     //at()为浅拷贝,只读拷贝;与[ ]效果一样
    {
        // dosomething 
     }
}


你可能感兴趣的:(QString和QByteArray的用法)