QT5开发及实例学习之三字符串类
文章目录
- 前言
- 一、操作字符串
- 二、查询字符串数据
- 三、字符串的转换
- 四、NULL字符串和空(empty)字符串的区别
- 五、隐式共享
- 六、内存分配策略
前言
标准C++提供了两种字符串:一种是C语言风格的以"\0"字符结尾的字符数组,一种是字符串类String。
QString类保存16位Unicode值,提供了丰富的操作、查询和转换等函数;还进行了使用隐式共享(implicit sharing)、高效的内存分配策略等多方面的优化。
一、操作字符串
(1)QString提供了一个二元的"+“操作符用于组合两个字符串,并提供了一个”+=“操作符用于将一个字符串追加到另一个字符串的末尾。
(2)QString::append()函数具有与”+=“操作符同样的功能,实现一个字符串的末尾追加另一个字符串。
(3)组合字符串的另一个函数是QString::sprintf(),此函数支持的格式定义符和C++库中的函数sprintf()定义的一样。
(4)Qt还提供了另一种方便的字符串组合方式,使用QString::arg()函数。通常,相对于QString::sprintf(),QString::arg()函数是比较好的解决方案,因为其类型安全,完全支持Unicode,且允许改变”%n"参数的顺序。
示例:
QString str;
str=QString("%1 was born in %2.").arg("Poro").arg(1995);
(5)QString也提供了一些其他组合字符串的方法,包括:
insert()函数:在原字符串特定位置插入另一个字符串;
prepend()函数:在原字符串开头插入另一个字符串;
replace()函数:用指定的字符串代替原字符串中的某些字符。
(6)去掉一个字符串两端的空白字符(回车字符"\n"、换行字符"\r"、制表符"\t"、空格字符" “):
QString::trimmed()函数:移除字符串两端的空白字符;
QString::simplified()函数:移除字符串两端的空白字符,使用单个空格字符” "代替字符串中出现的空白字符。
二、查询字符串数据
(1)QString::startsWith()函数判断一个字符串是否以某个字符串开头;两个参数分别为:第一个参数指定一个字符串,第二个参数指定是否大小写敏感(默认大小写敏感),判断是返回true。
(2)QString::endsWith()函数判断一个字符串是否以某个字符串结尾。
(3)QString::contains()函数判断一个指定的字符串是否出现过。
(4)比较两个字符串,方法如下:
operator<(const QString&):比较一个字符串是否小于另一个字符串;是返回true。
operator<=(const QString&):比较一个字符串是否小于等于另一个字符串;是返回true。
operator==(const QString&):比较两个字符串是否相等;是返回true。
operator>=(const QString&):比较一个字符串是否大于等于另一个字符串;是返回true。
localeAwareCompare(const QString&, const QString&):静态函数,比较前后两个字符串。若前面字符串小于后面字符串,则返回负整数值;若相等则返回0;若大于则返回正整数值。该函数的比较是基于本地字符集的。
compare(const QString&, const QString&, QT::CaseSensitivity):该函数可以指定是否进行大小写比较,而大小写比较完全基于字符的Unicode编码值,返回值类似于上一函数。
三、字符串的转换
(1)QString::toInt()函数将字符串转换为整型数值;该函数两个参数分别为:第一个参数是一个bool类型的指针,用于返回转换的状态,转换成功为true,否则为false;第二个参数指定了转换的基数,当基数设置为0时,将会使用C语言的转换方法,即 若字符串以"0x"开头,基数为16;若字符串以"0"开头,基数为8;其他情况基数一律为10。
类似函数还有toDouble()、toFloat()、toLong()、toLongLong()等。
(2)QString提供的字符编码集的转换函数将会返回一个const char类型版本的QByteArray,即构造函数QByteArray(const char)构造的QByteArray对象。
QByteArray类具有一个字节数组,既可以存储原始字节,也可以存储以"\0"结尾的8位字符串,支持隐式共享。
转换函数有以下几种:
toAscii():返回一个ASCII编码的8位字符串
toLatin1():返回一个Latin-1(ISO8859-1)编码的8位字符串
toUtf8():返回一个UTF-8编码的8位字符串(UTF-8支持整个Unicode字符集)
toLocal8Bit():返回一个系统本地编码的8位字符串
四、NULL字符串和空(empty)字符串的区别
NULL字符串就是使用QString的默认构造函数或者使用"(const char*)0"作为参数的构造函数创建的QString字符串对象;
空字符串是一个大小为0的字符串;
一个NULL字符串一定是一个空字符串,而一个空字符串未必是一个NULL字符串。
示例:
QString().isNull(); //结果为true
QString().isEmpty(); //结果为true
QString("").isNull(); //结果为false
QString("").isEmpty(); //结果为true
五、隐式共享
隐式共享又称回写复制。当两个对象共享同一份数据(通过浅拷贝实现数据块共享)时,如果数据不改变,则不进行数据的复制;而当某个对象需要改变数据时,则执行深拷贝。
深拷贝是指生成对象的一个完整的复制品;浅拷贝是指一个引用复制。
示例:
QString str1 = "data"; //初始化一个内容为"data"的字符串
QString str2 = str1; //(a)
str2[3] = 'e'; //(b)
str2[0] = 'f'; //(c)
str1 = str2; //(d)
(a)对str2赋值时,发生一次浅拷贝;两个QString对象都指向同一个数据结构;数据结构中除保存字符串外,还保存一个引用计数器,此时计数器为2。
(b)对str2修改时,发生一次深拷贝;str2对象指向一个新的数据结构。
(c)对str2修改时,不会引起任何形式的复制。
(d)将str2赋值给str1,str1将它指向的数据结构的引用计数器修改为0,其所指向的数据结构将会从内存中释放掉。
六、内存分配策略
QString在一个连续的内存块中保存字符串数据。当字符串的长度不断增长时,QString需要重新分配内存空间;分配策略如下:
- 每次分配4个字符空间,知道大小为20;
- 在20~4084之间,QString分配的内存块大小以2倍的速度增长;
- 从4084开始,每次以2048个字符大小(4096字节,即4KB)的步长增长。
QT5开发及实例学习之三字符串类相关推荐
- QT5开发及实例学习之十一Qt5文件操作功能
文章目录 一.新建文件 二.打开文件 三.打印文件 1. 文本打印 2. 图像打印 一.新建文件 实现新建文件功能的函数 showNewFile() 如下: void ImgProcessor:: ...
- Qt5开发及实例学习之标准颜色对话框类QColorDialog:选择某种颜色
2019独角兽企业重金招聘Python工程师标准>>> 1.新建"QT GUI",基类选择"QDialog',取消"创建界面" 2. ...
- QT5开发及实例学习之八基本对话框(一)
文章目录 前言 一.标准文件对话框类 二.标准颜色对话框类 三.标准字体对话框类 四.标准输入对话框类 1.标准字符串输入对话框 2.标准条目选择对话框 3.标准int类型输入对话框 4.标准doub ...
- QT5开发及实例学习之十八显示Qt5 SVG格式图片
SVG 的英文全称是 Scalable Vector Graphics,即可缩放的矢量图形.它是由万维网络联盟 ( World Wide Web Consortium, W3C ) 在 2000 ...
- QT5开发及实例学习之十七Qt5双缓冲机制
文章目录 一.原理与设计 二.绘图区的实现 三.主窗口的实现 一.原理与设计 所谓双缓冲机制,是指在绘制控件时,首先将要绘制的内容绘制在一个图片中,再将图片一次性地绘制到控件上.在早期的 Qt 版 ...
- QT5开发及实例学习之十六Qt5基础图形的绘制
文章目录 前言 一.绘图框架设计 二.绘图区的实现 三.主窗口的实现 前言 设计界面,区分各种形状及画笔颜色.画笔线宽.画笔风格.画笔顶帽.画笔连接点.填充模式.铺展效果.画刷颜色.画刷风格设置等 ...
- QT5开发及实例学习之十三Qt5文本编辑功能
文章目录 前言 一.设置字体 二.设置字号 三.设置文字加粗 四.设置文字斜体 五.设置文字加下画线 六.设置文字颜色 七.设置字符格式 前言 在编写包含格式设置的文本编辑程序时,经常用到的 Qt ...
- QT5开发及实例学习之十Qt5主窗口构成
文章目录 一.基本元素 1.菜单栏 2.状态栏 3.工具栏 4.锚接部件 5.中心部件 6.激活上下文菜单 二.文本编辑器示例 三.菜单与工具栏的实现 1. 动作(Action)的实现 2. 菜单(M ...
- QT5开发及实例学习之九基本对话框(二)
文章目录 前言 一.工具盒类 二.进度条 三.调色板与电子钟 1.QPalette类 2.QTime类 四.可扩展对话框 五.不规则窗体 六.程序启动画面(QSplashScreen) 前言 本章 ...
最新文章
- 文件操作:在某手诗文中插入一句话
- python tabula 使用方法_Python中os.walk()的使用方法
- 跳一跳python源码下载_python 微信跳一跳和源码解读
- python练习笔记——利用信号signal处理僵尸进程
- php session redis db,php session redis 配置
- uos配置 java 环境变量_CentOS 7.3 环境配置java和tomcat开机启动
- python增量赋值是什么意思_关于python中的增量赋值的理解
- mysql windows 安装 错误
- 软件开发高手须掌握的4大SQL精髓语句(综合篇)
- android获取sd卡mount,Android如何获取所有存储卡挂载路径
- golang在windows下编译Linux下的文件
- 浅谈Java两种并发类型——计算密集型与IO密集型
- 数据分析实践——如何搭建数据指标体系(抖音为例)
- sqlmap用法详解
- windows操作系统---1
- java 计算经度纬度之间的距离
- DC的逻辑综合与优化
- 解决win10下samba不能访问
- 并行计算————计算机架构
- 真正的自由是节制欲望自律简朴地去生活
热门文章
- django得到Model的全部字段名(field)
- Ubuntu/Centos 等linux终端忽略大小写提示
- 此上下文中不允许函数定义。_彻底搞懂上下文this,轻松应对,一面就过!!!...
- java table 设置长度_Java字节码lookupswitch和tableswitch总指令长度
- GEETEST极验召集互联网大佬齐聚光谷,共同探讨交互安全问题
- 构建之法首周阅读体会
- 构建之法----软件工程简介
- 一个图文混排问题的解决过程
- Linux 系统之Sysvinit
- jquery 获取当前元素的索引值