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);unicode字符转中文
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 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
返回一个大小为宽度的字符串,其中包含由填充字符填充的此字符串。
如果truncate是false并且字符串的size () 大于width,则返回的字符串是字符串的副本。
如果truncate是true并且字符串的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" );
2.3删除函数
2.3.1 chop
从字符串末尾删除n个字符。
如果n大于或等于size(),则结果为空字符串;如果n是负数,它就等于过零。
无返回
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个字节
2. 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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。