QT(19):QChar和QByteArray

QChar

在Qt中,Unicode字符是没有任何标记或结构的16位实体。QChar表示这样的实体。它是轻量的,因此可以在任何地方使用。大多数编译器将其视为unsigned short

QChar 提供了构造函数和强制转换运算符与传统的8位字符进行转换。如果定义了QT_NO_CAST_FROM_ASCIIQT_NO_CAST_TO_ASCIIchar,则需要显式调用fromLatin1()或使用QLatin1Char()从8位构造QChar,并且需要调用toLatin1()来获取8位字符。

QChar的定义内部只保存了一个ushort类型的成员变量ucs,其它都是属性和方法。

class Q_CORE_EXPORT QChar {
public://....Q_DECL_CONSTEXPR QChar() noexcept : ucs(0) {}Q_DECL_CONSTEXPR QChar(ushort rc) noexcept : ucs(rc) {} // implicitQ_DECL_CONSTEXPR QChar(uchar c, uchar r) noexcept : ucs(ushort((r << 8) | c)) {}//....
private://....ushort ucs;
};

QString在构造时调用QTypedArray的allocate函数,将返回的地址赋值给指针d。data()返回ushort *类型指针,对指针进行[]运算符结果进行初始化,相当于从data()返回地址开始构造一个数组,每一个元素存储一个QChar,即unsigned short

template <class T>
struct QTypedArrayData: QArrayData
{	//......T *data() { return static_cast<T *>(QArrayData::data()); }
};
typedef QTypedArrayData<ushort> QStringData;
typedef QStringData Data;
Data* d;
QString::QString(QChar ch)
{d = Data::allocate(2);Q_CHECK_PTR(d);d->size = 1;d->data()[0] = ch.unicode();d->data()[1] = '\0';
}

char

char是C++的基本字符类型,用于存储 ASCII 字符。QString采用UTF-16编码,将传入的char*字符串参数当作UTF-8格式进行转换。
const char *为参数的拷贝赋值运算符,调用了fromUtf8()fromUtf8()返回QString,再调用以const QString &的拷贝赋值运算符,浅拷贝d指针。

inline QT_ASCII_CAST_WARN QString &operator=(const char *ch){ return (*this = fromUtf8(ch)); }

const char *为参数的构造函数,调用了fromAscii_helper()fromAscii_helper()返回d指针,拷贝。

inline QT_ASCII_CAST_WARN QString(const char *ch): d(fromAscii_helper(ch, ch ? int(strlen(ch)) : -1)) {}
QString::Data *QString::fromAscii_helper(const char *str, int size)
{QString s = fromUtf8(str, size);s.d->ref.ref();return s.d;
}
static inline QString fromUtf8(const char *str, int size = -1)
{return fromUtf8_helper(str, (str && size == -1) ? int(strlen(str)) : size);
}

QByteArray

[ref|size|alloc|reserve|offset|Byte|Byte|Byte|...]

QByteArray 可用于存储原始字节(包括“\0”)和传统的 8 位“\0”结尾字符串。使用 QByteArray 比使用const char *更方便。QByteArray 始终确保数据后跟一个“\0”终止符,并使用(写入时复制)来减少内存使用量并避免不必要的数据复制。

除了QByteArray之外,Qt还提供了存储字符串数据的类QString。在大多数情况下,使用QString,将其内容理解为 Unicode 文本(使用 UTF-16编码),其中 QByteArray 旨在避免对其存储的字节的编码或语义进行假设(除了一些使用 ASCII 的传统情况)。此外,在Qt API中始终使用QString。QByteArray 适用的两种主要情况是需要存储原始二进制数据时,以及内存保护至关重要时(例如,使用 Qt for Embedded Linux)。

初始化 QByteArray 的一种方法是简单地将const char *传递给其构造函数。

QByteArray 通常将数据作为字节处理,而不假定任何语义,在假定语义的情况下,它使用 C 语言环境和 ASCII 编码。QString支持标准的Unicode编码,其他编码可能支持使用QStringEncoder和QStringDecoder 转换为Unicode。对于特定于区域设置的文本解释,请使用QLocal或QString。

在QByteArray的定义中,可以知道QByteArray和QString类似,使用类模板QTypedArrayData类型的指针d管理数据,模板实参为char,采用“隐式共享”的机制减少不必要的拷贝。

class Q_CORE_EXPORT QByteArray
{
private:typedef QTypedArrayData<char> Data;
public://......
private:Data *d;//......
};

d指针返回的对象为char *的指针,指向为字节数组的开始地址,通过[]运算符对字节数组赋值。

QByteArray& QByteArray::append(char ch)
{if (d->ref.isShared() || uint(d->size) + 2u > d->alloc)reallocData(uint(d->size) + 2u, d->detachFlags() | Data::Grow);d->data()[d->size++] = ch;d->data()[d->size] = '\0';return *this;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/185526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4.7-容器网络之host和none

这一节我们来看一下docker中的另外两种网络&#xff0c;host和none。 docker network inspect none 于是就看到Containers, 里面包含了一个test1 表示这个容器连接到了none。

Python生产者与消费者模型

1、 # coding : UTF-8 import threading, time # 导入相关模块 class Message: # 数据的描述类型 def __init__(self): # 构造方法 self.__title None # 初始化属性 self.__content None # 初始化属性 def set_info(self, title, content): # 进…

陈嘉庚慈善践行与卓顺发的大爱传承

陈嘉庚慈善践行&#xff0c;了解陈嘉庚后人与卓顺发的大爱传承。 2023年11月25日,卓顺发太平绅士以及陈家后人在分享他们对慈善领域见解的过程中,特别强调了慈善在促进社会和谐以及推动社会进步方面的关键作用。同时,他们深入探讨了如何在当今社会中继续传扬和实践家国情怀以及…

清理docker Build Cache缓存文件

使用docker构建镜像&#xff0c;发现docker的overlay2文件会越来越大。 使用命令查看docker系统占用资源&#xff1a; docker system df 可以看到已经占用了26.7GB&#xff0c;清理这个缓存 docker builder prune 再次查看&#xff0c;已经没有缓存了&#xff0c;清理成功。 …

Linux基础操作二:Linux系统介绍

1、系统启动过程 Linux系统的启动过程并不是大家想象中的那么复杂&#xff0c;其过程可以分为5个阶段&#xff1a; 内核的引导。运行 init。系统初始化。建立终端 。用户登录系统。 1.1、内核引导 当计算机打开电源后&#xff0c;首先是BIOS开机自检&#xff0c;按照BIOS中…

固态继电器的分类:揭秘热门趋势

固态继电器(SSR)已成为现代电子和自动化系统不可或缺的一部分&#xff0c;与传统电磁继电器相比具有众多优势。随着技术的进步&#xff0c;SSR的分类不断发展&#xff0c;催生了令人兴奋的趋势和创新。在本文中&#xff0c;我们将探讨SSR分类的最新趋势&#xff0c;阐明该领域的…

10.索引

一.索引简介 索引用于快速找出在某个列中有一特定值的行。 不使用索引&#xff0c;MySQL必须从第1条记录开始读完整个表&#xff0c;直到找出相关的行。表越大&#xff0c;查询数据所花费的时间越多。 如果表中查询的列有一个索引&#xff0c;MySQL能快速到达某个位置去搜寻…

计算机毕业设计 基于Web的课程设计选题管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

css 字体倾斜

css 字体倾斜 //左右倾斜 transform: skew(40deg, 0deg);//上下倾斜 transform: skew(0deg, 16deg);

【代码】考虑区域多能源系统集群协同优化的联合需求侧响应模型(完美复现)

程序名称&#xff1a;考虑区域多能源系统集群协同优化的联合需求侧响应模型 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 代码简介&#xff1a;风电、光伏发电等波动电源接入比例不断提高&#xff0c;使得区域多能源系统中能量转化和协调能力减弱。基于此&#xff0c;该…

面试:SpringMVC问题

文章目录 SpringMVC运行流程MVC的概念与请求在MVC中的执行路径&#xff0c;ResponsBody注解的用途SpringMVC启动流程SpringMVC的拦截器和过滤器有什么区别&#xff1f;执行顺序&#xff1f;Spring和SpringMVC为什么需要父子容器&#xff1f; SpringMVC运行流程 • 客户端&#…

Docker Swarm总结+Jenkins安装配置与集成snarqube和目标服务器(4/5)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

海外热门:香港服务器和美国服务器的成本较量

​  提到 2023 年海外热门服务器&#xff0c;在整个 IDC 站长圈中&#xff0c;要数香港服务器和美国服务器的关注度一直居高不下。其实也正常&#xff0c;毕竟这两种海外服务器相较成熟。不过&#xff0c;在实际使用中&#xff0c;两者也会被拿来对比&#xff0c;最显而易见的…

Python多线程优化:提升程序性能的实例

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python多线程优化&#xff1a;提升程序性能的实例&#xff0c;全文5600字&#xff0c;阅读大约16钟。 多线程是一种有效的并发编程方式&#xff0c;能够提高程序的性能。本文…

(六)基于高尔夫优化算法GOA求解无人机三维路径规划研究(MATLAB代码)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、高尔夫优化算法GOA简介 高尔夫优化算法…

c++——取地址(引用)和取内容(解引用)操作

今天又做蒙了一道题&#xff0c;把思考和实验记录下来。 struct sk{ int a; float b;}data; int *p; 若要使p指向data中的a域&#xff0c;正确的赋值语句是 p&a; pdata.a; p&data.a; *pdata.a前两个可以很容易看出错误之处&#xff0c;a是结构体内的变量&#xff0c;需…

P0级事故频发后,这家公司终于醒悟了!

近期&#xff0c;国内的互联网大厂接连爆发P0级事件&#xff0c;阿里云崩完滴滴崩&#xff0c;企业在追求效益的前提是业务的连续和稳定。如果发生故障不能快速恢复&#xff0c;引发业务中断&#xff0c;给企业带来的损失是巨大的&#xff0c;换言之&#xff0c;企业需要一套清…

OFDM通信连路仿真学习

文章目录 前言一、前置知识1、块状导频与梳状导频①、相似点②、区别③、其他 2、其他知识 二、仿真任务及方案1、仿真任务2、仿真方案 三、MATLAB仿真1、MATLAB 源码2、程序流程3、仿真结果①、打印信息③、8PSK 星座图②、脉冲成型图③、ETU300登加AWGN信道下误比特率曲线 四…

Windows系统搭建Appium 2 和 Appium Inspector 环境

前言 自 2022 年 1 月 1 日起&#xff0c;Appium 核心团队不再维护 Appium 1.x。官方支持的平台驱动程序的所有最新版本均不兼容 Appium 1.x&#xff0c;需要 Appium 2 才能运行。 Appium 2是一个自动化移动应用程序的开源工具&#xff0c;它带来了以下重要改进&#xff1a;  …

PowerDesigner数据库建模软件的安装

解压&#xff1a; 解压好以后&#xff0c;点击PowerDesigner.exe安装 这个安装的版本是15 选择安装路径&#xff0c;可以默认可以自定义&#xff1a; 直接点next&#xff1a; 全选了 点击next&#xff1a; 点击next&#xff1a; 点finish 汉化&#xff1a; 先把pojie和汉化文件…