mm晴朗 |
2023-01-31 16:25 |
QT(1)- QString
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 (),这将很有用。 注意:定义qtlimittedcastfromascii也会禁用这个构造函数,但会启用一个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); 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 占位填充 数据,长度,进制,填充字节 数据,长度,格式,精度,填充字节 数据,长度,填充字节 2.2.3 += 向后追加 2.2.4 push_back 向后追加;可以追加字符串,也可以追加字节 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之后的字符串副本中的任何字符,并返回副本 2.2.6 repeated QString QString::repeated(int times) const 返回重复指定次数的此字符串的副本。 如果times小于 1,则返回一个空字符串。 2.3删除函数 2.3.1 chop
从字符串末尾删除n个字符。 如果n大于或等于size(),则结果为空字符串;如果n是负数,它就等于过零。 无返回 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 QString &QString::remove(int position, int n) 从指定位置删除n个字节 QString &QString::remove(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) 删除字符串中的str(QChar,QString,QRegExp(正则表达式)) 2.4查询函数 2.4.1 at 查询指定位置的字符 2.4.2 front back front返回字符串最前面一个字符 QString str = "sddd"; qDebug()<<str.front();//s back返回字符串最后一个字符 2.4.3 contains 如果此字符串包含字符串str出现,则返回true;否则返回false。 如果cs是Qt::CaseSensitive(默认),则搜索是区分大小写的;否则,搜索不区分大小写。 2.4.4 compare 从词法上比较此字符串与另一个字符串,如果此字符串小于、等于或大于另一个字符串,则返回小于、等于或大于零的整数。 2.4.5 count 返回字符串str在此字符串中出现的次数(可能重叠)。 如果cs是Qt::CaseSensitive(默认),则搜索是区分大小写的;否则,搜索不区分大小写。 2.4.6 endsWith 如果字符串以s结尾返回true;否则返回false。 如果cs是Qt::CaseSensitive(默认),则搜索是区分大小写的;否则,搜索不区分大小写。 QString str = "Bananas"; str.endsWith("anas"); // returns true str.endsWith("pple"); // returns false 2.4.7 startsWith 如果字符串以str开头,则返回true;否则返回false。 如果cs是Qt::CaseSensitive(默认),则搜索是区分大小写的;否则,搜索不区分大小写。 QString str = "Bananas"; qDebug()<<str.startsWith("Bana"); // returns true qDebug()<<str.startsWith("pple"); // returns false 2.4.8 indexof int QString::indexOf(const QString &str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const 返回此字符串中字符串str第一次出现的索引位置,从的索引位置向后搜索。如果没有找到str,返回-1。 如果cs是Qt::CaseSensitive(默认),则搜索是区分大小写的;否则,搜索不区分大小写。 QString str = "sdsdd"; qDebug()<<str.indexOf("s",1);//2 qDebug()<<str.indexOf('s');//0 2.4.9 lastIndexOf int QString::lastIndexOf(const QString &str, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const 返回字符串(QChar)str在此字符串中最后一次出现的索引位置,从索引位置从向前搜索。如果from是-1(默认),则从最后一个字符开始搜索;如果from是-2,则在最后一个字符的旁边,依此类推。如果没有找到str,返回-1。 2.4.10 left right QString QString::left(int n) const 返回包含字符串最左边n个字符的子字符串。 如果n大于或等于size(),或小于零,则返回整个字符串。 QString x = "Pineapple"; QString y = x.left(4); QString s = x.right(4); qDebug()<<y<<s;//"Pine" "pple" 2.5 修改函 2.5.1 fill 将字符串中的每个字符设置为字符ch。如果size不等于-1(默认值),则字符串的大小将预先调整为size。 QString str = "s"; str.fill('d',3); qDebug()<<str;//ddd 2.5.2 insert insert(int position, const QString &str) 在指定的位置插入字符串(QChar,QByteArry,const char*,QStringRef) 2.5.3 replace
2.5.4 resize 将字符串的大小设置为字符大小。 如果size大于当前的大小,则扩展字符串,使其具有大小字符长,并将额外的字符添加到末尾。新字符未初始化。 如果size小于当前大小,字符将从末尾删除。 QString s = "Hello world"; s.resize(5); // s == "Hello"
s.resize(8); // s == "Hello???" (where ? stands for any character) 2.5.6 section 此字符串被视为由字符sep分隔的字段序列。返回的字符串由从位置开始到位置结束的字段组成。如果未指定 end,则包括从位置start**到字符串结尾的所有字段。字段编号为 0、1、2 等,从左数起,-1、-2 等,从右到左数。 flags参数可用于影响函数行为的某些方面,例如是否区分大小写、是否跳过空字段以及如何处理前导和尾随分隔符 QString str = "/section/inu/dd/eee/ddd"; qDebug()<<str.section('/',2,2);//inu qDebug()<<str.section('/',2,3);//inu/dd QString::SectionFlag flag = QString::SectionSkipEmpty; qDebug()<<str.section('/',2,3,flag);//dd/eee 2.6 判断函数 2.6.1 isLower isUpper bool QString::isLower() const 如果字符串为小写,则返回true,也就是说,它与tollower()折叠相同。 QString str = "aGsdd"; qDebug()<<str.isLower();//false bool QString::isUpper() const 如果字符串为大写,则返回true 2.6.2 isEmpty isNull bool QString::isEmpty() const QString().isEmpty(); // returns true QString("").isEmpty(); // returns true QString("x").isEmpty(); // returns false QString("abc").isEmpty(); // returns false bool QString::isNull() const QString().isNull(); // returns true QString("").isNull(); // returns false QString("abc").isNull(); // returns false 2.6.3 isRightToLeft() bool QString::isRightToLeft() const 如果从右向左读取字符串,则返回true。 2.7 转换函数 2.7.1 setNum QString &QString:: setNum ( int n , int base = 10) 将整数按照相应的进制转换成字符串 QString &QString:: setNum (double n, char format = 'g', int precision = 6) 将小数按照给定的格式和精度打印到字符串中 |
|