其余相关的类
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
}
}