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);
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 str = "hello";
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

返回一个大小为宽度的字符串,其中包含由填充字符填充的此字符串。

如果truncatefalse并且字符串的size () 大于width,则返回的字符串是字符串的副本。

如果truncatetrue并且字符串的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" );
str.repeated(4);// 返回“abababab”

2.3删除函数

2.3.1 chop

从字符串末尾删除n个字符。

如果n大于或等于size(),则结果为空字符串;如果n是负数,它就等于过零。

无返回

QString str = "hello00";
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个字节

  1. 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

2.4.3 contains

如果此字符串包含字符串str出现,则返回true;否则返回false。

如果cs是Qt::CaseSensitive(默认),则搜索是区分大小写的;否则,搜索不区分大小写。

QString str = "hello word! Today is very good!";
qDebug()<<QString(str.contains("hello")?"yes":"no");//yes
qDebug()<<QString(str.contains('h')?"yes":"no");//yes
qDebug()<<QString(str.contains('p')?"yes":"no");//no

2.4.4 compare

从词法上比较此字符串与另一个字符串,如果此字符串小于、等于或大于另一个字符串,则返回小于、等于或大于零的整数。

QString str1 = "a";
QString str2 = "A";
qDebug()<<str1.compare(str2);

2.4.5 count

返回字符串str在此字符串中出现的次数(可能重叠)。

如果cs是Qt::CaseSensitive(默认),则搜索是区分大小写的;否则,搜索不区分大小写。

QString str1 = "addaa";
qDebug()<<str1.count("a");//3
qDebug()<<str1.count('a');//3

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

QString & replace(int position, int n, const QString &after) 从position位置开始向后的n个字节作为一整个字符串,被替换成after
QString & replace(int position, int n, QChar after) 从position位置开始向后的n个字节作为一整个字符串,被替换成after
QString & replace(int position, int n, const QChar **unicode*, int size) 从position位置开始向后的n个字节作为一整个字符串,被替换成指定大小的unicode
QString & replace(QChar before, QChar after, Qt::CaseSensitivity cs = Qt::CaseSensitive) 所有的befor被替换成after

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)

将小数按照给定的格式和精度打印到字符串中

QT(1)- QString的更多相关文章

  1. Qt 的QString类的使用

    Qt的QString类提供了很方便的对字符串操作的接口. 使某个字符填满字符串,也就是说字符串里的所有字符都有等长度的ch来代替. QString::fill ( QChar ch, int size ...

  2. QT之QString的arg方法

    转载.标记一下,总结的很好 转自 http://www.cnblogs.com/lomper/p/4135387.html 在QT的QString中,arg方法类似于C中的printf中使用的格式输出 ...

  3. Qt的QString转换问题

    之前是写C#的,涉及类型转换要么是强转,类似(String)这样,要么是用Converter提供的转换方法,但是今天开发qt界面的时候,使用(QString)强转int类型的时候出现了乱码: 后来研究 ...

  4. Qt中 QString 和int, char等的“相互”转换

    转载:http://blog.csdn.net/ei__nino/article/details/7297791 Qt中 int ,float ,double转换为QString 有两种方法 1.使用 ...

  5. Qt中 QString 和int, char等的“相互”转换,关键是QString.toLocal8Bit().data();

    Qt中 int ,float ,double转换为QString 有两种方法 1.使用 QString::number(); 如: long a = 63; QString s = QString:: ...

  6. Qt 中QString 字符串操作:连接、组合、替换、去掉空白字符

    Qt中的字符串类 QString类 保存了16位Unicode值,提供了丰富的操作.查询和转换等函数. QString 字符串有如下几个操作符: (1) "+" 用于组合两个字符串 ...

  7. Qt下 QString转char*

    Qt下面,字符串都用QString,确实给开发者提供了方便.Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型 Qt再使用第三方开源库时,由于库的类型基本上都 ...

  8. QT中QString 与 int float double 等类型的相互转换

    Qt中 int ,float ,double转换为QString 有两种方法 1.使用 QString::number(); 如: long a = 63; QString s = QString:: ...

  9. Qt中QString、QByteArray、int、double之间转换

    最近写Qt中的tcp网络编程,Socke连接后,接受到的数据类型是字节型,这就涉及到了大量的类型转换,在网上辗转几辄,总算有了点结果,特此跟大家分享.好了,不废话,下面细说. 方法/步骤     1. ...

  10. Qt下QString转char*

    Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的 ...

随机推荐

  1. 使用react-test-renderer/shallow写测试

    我的项目是采用react + ts来写的,项目中要写单元测试,于是采用了Jest库,  主要用的package有 react-test-renderer react-test-renderer/sha ...

  2. Java原生图片Base64转码与Base64解码

    原文地址 import org.apache.commons.codec.binary.*; import java.io.*; import java.net.*; /** * 将file文件转换为 ...

  3. 利用InnoStep在VS编译时自动构建安装包

    摘要 很多同学在C/S开发领域或多或少都可能会遇到需要制作安装包的场景,打包的工具也是五花八门,例如有NSIS.InstallShield.Wix Toolset.ClickOnce等等,这里以Inn ...

  4. VS Code好用插件: Easy Less

    插件 编译less并输出CSS文件 输出文件

  5. Mysql高级5-SQL优化

    一.插入数据优化 1.1 批量插入 如果有多条数据需要同时插入,不要每次插入一条,然后分多次插入,因为每执行一次插入的操作,都要进行数据库的连接,多个操作就会连接多次,而一次批量操作只需要连接1次 1 ...

  6. ABC295 D题 题解

    题意简述 给定一个长度不超过\(\;5\times 10^5\;\)的,仅有数字构成的字符串,问存在多少段子串,使得子串内字符重新排序后,前半段与后半段相同? 做法分析 重组后前后两部分相同,其实也就 ...

  7. Django视图与网址进阶

    1. 采用/add/?a=4&b=5这样get方法进行 1)修改learn/views.py文件 代码: #增加新函数 def add(request): a=request.GET['a'] ...

  8. 蚂蚁集团混沌工程 ChaosMeta V0.5 版本发布

    混沌工程 ChaosMeta 的全新版本 V0.5 现已正式发布!该版本包含了许多新特性和增强功能,为用户提供了支撑混沌工程各个阶段的平台能力,以及降低使用门槛的用户界面. ChaosMeta V0. ...

  9. Z-Blog火车头免登录发布教程+插件3.2+支持最新Z-Blog1.7

    Z-Blog免登录采集评论,之前没有加入评论接口,今天把评论接口写好了,写一下简单的教程,(采集评论规则是一件很麻烦的事)有时候采集文章的时候也采集评论,今天教大家怎样用我的Z-Blog免登录采集插件 ...

  10. Machine Learning for NetFlow Anomaly Detection With Human-Readable Annotations 笔记

    Machine Learning for NetFlow Anomaly Detection With Human-Readable Annotations 关键摘要 我们开发了一个复杂企业网络中的异 ...