(2)Qt中的字符串类型

简介: 本文介绍了Qt中的字符串类型QByteArray和QString,包括它们的构造函数、数据操作方法、查找操作、遍历操作以及与其他类型之间的转换,并解释了它们之间的区别。

字节数组(QByteArray)

在Qt中QByteArray可以看做是C语言中 char*的升级版本。我们在使用这种类型的时候可通过这个类的构造函数申请一块动态内存,用于存储我们需要处理的字符串数据。

1.构造函数

// 构造空对象
QByteArray::QByteArray();

// 将data中的size个字符进行构造, 得到一个字节数组对象
// 如果 size==-1 函数内部自动计算字符串长度, 计算方式为: strlen(data)
QByteArray::QByteArray(const char *data, int size = -1);

// 构造一个长度为size个字节, 并且每个字节值都为ch的字节数组
QByteArray::QByteArray(int size, char ch);
//QByteArray 字节数组的使用
QByteArray array(5, 'A');   //存储5个字符'A'的字节数组
qInfo() << array;
QByteArray name = "yes";
qInfo() << name;

2.数据操作

基本数据操作

const char* str = "hello";
QByteArray name1(str);
qInfo() << "原字符串:" << name1;
//头部追加
name1.push_front("juny, ");
name1.prepend("Hi ");
qInfo() << "头部追加:" << name1;
//尾部追加
name1.push_back(" world");
name1.append("!");
qInfo() << "尾部追加:" << name1;
//指定位置插入
name1.insert(3, "good ");
qInfo() << "3的位置追加:" << name1;
//数据删除
name1.remove(3, 5); //从3的位置删除5个
qInfo() << "3的位置删除5个:" << name1;
//尾部删除
name1.chop(1);
qInfo() << "尾部删除一个:" << name1;
//保留前面,截断后面
name1.truncate(6);
qInfo() << "截断6后面所有字符:" << name1; //包括位置6上的字符

字节数组查找操作

//清空字节数组
name1.clear();
qInfo() << "清空后:" << name1;
//字符查找
name1 = "I'm cat,is very good, and you?";
qInfo() << "m第一次出现的index:" << name1.indexOf('m');    //返回index
qsizetype pos = name1.indexOf('o');
qInfo() << "o第一次出现的位置为:" << pos;
pos = name1.lastIndexOf('o');
qInfo() << "o最后一次出现的位置为:" << pos;

//判断name1中是否包含一个子串
if (name1.contains("very"))
{
    qInfo() << "name1 中包含 very";
}
//判断name1中是否以I开始以?结束
if (name1.startsWith("I") && name1.endsWith("?"))
{
    qInfo() << "name1中是以I开始以?结束的";
}

字节数组遍历操作

//字节数组的遍历
qInfo() << "---------------------------";
name1 = "LOVE";
for (auto& v : name1)
{
    qInfo() << v;
}
qInfo() << "---------------------------";
for (int i = 0; i < name1.size(); i++)
{
    qInfo() << name1[i];    //下标法
    qInfo() << name1.at(i); //java风格访问
}
qInfo() << "---------------------------";
QByteArray::iterator iter = name1.begin();
for (iter; iter != name1.end(); iter++)
{
        qInfo() << *iter;
}

字节数组与其它类型之间的转换

//QByteArray --> char*
qInfo() << name1.data();        //返回值为char*
qInfo() << name1.constData();    //返回值为const char*

//基本数据类型 --> QByteArray
QByteArray num;
num.setNum(1314520, 16);        //将参数一转换为16进制字符串
qInfo() << num;                    //"140ed8"

num.setNum(3.1415926, 'e', 3);    //小数位数三位
qInfo() << num;                    //"3.142e+00"
num.setNum(3.1415926, 'g', 3);    //有效位数三位
qInfo() << num;                    //"3.14"

//静态函数的使用
qInfo() << QByteArray::number(3.1415, 'g', 2);    //"3.1"

//QByteArray --> 基本数据类型
QByteArray sum("666");
qInfo() << sum.toInt();        //666
qInfo() << QByteArray("10000000000").toInt(); //若数据越界,返回值为0

bool isOk = false;
sum = "10";
uint n = sum.toUInt(&isOk, 16);    //16标识的是原来sum中的数为16进制数
if (isOk)
{
    qInfo() << n;        //16
}

字符串(QString)

QString也是封装了字符串, 但是内部的编码为utf8, UTF-8属于Unicode字符集, 它固定使用多个字节(window为2字节, linux为3字节)来表示一个字符,这样可以将世界上几乎所有语言的常用字符收录其中。

1.构造函数

// 构造一个空字符串对象
QString();
// 将 char* 字符串 转换为 QString 类型
QString(const char *str);
// 将 QByteArray 转换为 QString 类型
QString(const QByteArray &ba);

2.数据操作

//QString 是自带编码的
QString name("Junk is very good teacher!Good GOOD GOod!");
qInfo() << name;

//替换
//Qt::CaseSensitivity::CaseInsensitive 替换时忽略大小写
name.replace("good", "bad", Qt::CaseSensitivity::CaseInsensitive);
qInfo() << name;

//格式化字符串
QString _name = "Mary";
qint32 age = 18;
QString job = "打螺丝";
qInfo() << _name + QString::number(age) + job;
qInfo() << QString::asprintf("我是%s,今年%d岁,我的工作是%s",
                             _name.toStdString().data(), age, 
                            job.toStdString().data());
qInfo() << QString("我是%1,今年%2岁,我的工作是%3")
    .arg(_name)
    .arg(age)
    .arg(job);

//输出时间
quint32 second = 3600520;
auto str = QString("%1天,%2:%3:%4")
    .arg(second / 3600 / 24)
    .arg(second % 24, 2, 10, QChar('0')) //输出宽度2  十进制  填充字符
    .arg(second % 60)
    .arg(second % 24 % 60);
qInfo() << str;

QByteArray与QString的区别

//获取本地编码
QString s("哈hello");
qInfo() << "本地编码:" << s.toLocal8Bit();
//获取utf8编码
qInfo() << "utf8编码:" << s.toUtf8();

QByteArray array("go home!"); 
QString str("go home!");
qInfo() << array.size();      //8  字节个数
qInfo() << str.size();          //8  字符个数
qInfo() << "array:" << array;
qInfo() << "str:" << str;

QByteArray array1("go home!哈");
QString str1("go home!哈");
qInfo() << array1.size();      //11  字节个数
qInfo() << str1.size();          //9  字符个数
qInfo() << "array:" << array1;
qInfo() << "str:" << str1;

相关文章
|
28天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
4天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
442 17
|
7天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
20天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
7天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
380 2
|
22天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
24天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2600 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
6天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
289 2
|
4天前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
106 65
|
24天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1582 17
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码