在Qt框架中,QString 是一个强大而灵活的字符串容器,专为处理 Unicode 字符而设计。它提供了许多方便的方法来操作和处理字符串,使得在跨平台开发中能够轻松地进行文本操作。QString 是 Qt 开发中不可或缺的一部分,它的灵活性和强大的功能使其成为处理文本和字符串操作的理想选择。本篇博客将深入探讨 QString 的各种用法,包括字符串的连接、追加与移除、格式化输出、统计字符串长度、去空格操作、字符串的切割与截取,以及类型转换等,以帮助读者更好地利用这一重要的字符串容器。

首先读者需要打开Qt Creator程序并新建一个Qt Console Application项目,创建选项我们可以直接采用默认配置,当创建成功后读者可看到如下图所示的默认选项;

上述案例中使用的就是命令行程序开发,接下来我们将演示如何灵活的使用QString容器实现对字符串的灵活管理,在使用之前读者需要包含#include <QString>头文件,该文件内包含了所有字符串操作函数。

1.1 连接追加与移除操作

1.1.1 字符串连接

在Qt中,字符串的定义可以使用QString str1的方式实现,我们可以使用简单的加号 + 或者 append 方法将两个字符串连接在一起。

代码中的toStdString则代表将字符串转换为标准的std格式,除了使用 toStdString()QString 转换为标准的 C++ 字符串 (std::string) 之外,还有其他几种字符串转换的方法:

  1. toLatin1()toUtf8()

    • toLatin1() 返回一个 Latin-1 编码的 QByteArray,其中包含了 QString 的内容。

    • toUtf8() 返回一个 UTF-8 编码的 QByteArray

      QString str = "Hello, LyShark!";
      QByteArray latin1Data = str.toLatin1();
      QByteArray utf8Data = str.toUtf8();
  2. toLocal8Bit()

    • 返回一个包含 QString 内容的 QByteArray,使用本地字符集编码。

      QString str = "Hello, LyShark!";
      QByteArray localData = str.toLocal8Bit();
  3. toLatin1()toUtf8()toLocal8Bit()constData() 方法:

    • 这些方法返回一个指向字符串数据的常量指针,可以直接传递给需要 C 风格字符串的函数。

      QString str = "Hello, LyShark!";
      const char* latin1Data = str.toLatin1().constData();
      const char* utf8Data = str.toUtf8().constData();
      const char* localData = str.toLocal8Bit().constData();

这些方法允许根据需要选择不同的字符集和编码方式,并在Qt应用程序中方便地进行字符串和字节数组之间的转换。

如下我们演示如何简单的实现字符串的拼接,示例代码如下:

#include <QCoreApplication>
#include <QString>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); QString Str1 = "hello";
QString Str2 = "lyshark";
QString temp; temp = Str1 + " " + Str2; std::cout << temp.toStdString().data() << std::endl;
std::cout << (Str1 + " " + Str2).toStdString().data() << std::endl; return a.exec();
}

1.1.2 追加与移除

QString 提供了多种方法来追加与移除字符串,追加时可以使用append()/push_back()在移除时可以使用remove(),而prepend()提供了在头部追加的功能。

#include <QCoreApplication>
#include <QString>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); QString Str = "hello "; Str.append("lyshark");
Str.push_back("test");
Str.remove("hello");
Str.prepend("-->"); std::cout << Str.toStdString().data() << std::endl; return a.exec();
}

1.1.3 字符串链接

QString容器默认就支持自定义输出,该容器内部有一个sprintf可以很容易的实现字符串的连接与个性化输出,当然了其初始化有两种方式,一种是定义后调用,另一种是在初始化时填充。

#include <QCoreApplication>
#include <QString>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); QString Str1;
Str1.sprintf("%s %s","Welcome","to you !");
std::cout << Str1.toStdString().data() << std::endl; QString Str2;
Str2 = QString("%1 is age = %2 . ").arg("lyshark").arg("24");
std::cout << Str2.toStdString().data() << std::endl;
std::cout << (QString("1") + QChar('A')).toStdString().data() << std::endl;
std::cout << (QString("2") + QString('B')).toStdString().data() << std::endl; return a.exec();
}

1.1.4 字符串长度统计

字符串长度统计有多种方式,可以使用count()也可以是size()也可以使用length()三者均可以。

#include <QCoreApplication>
#include <QString>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); QString Str1;
Str1.sprintf("%s %s","Welcome","to you !");
std::cout << Str1.toStdString().data() << std::endl; // 实现统计字符串长度
std::cout << Str1.count() << std::endl;
std::cout << Str1.size() << std::endl;
std::cout << Str1.length() << std::endl; return a.exec();
}

1.1.5 字符串去空格

空格的去除有多种方式,使用trimmed()可实现去掉字符串首尾两端空格,使用simplified可去掉所有空格,中间连续的只保留一个。

#include <QCoreApplication>
#include <QString>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); // 去空格
QString Str1 = " hello lyshark welcome ! "; Str1 = Str1.trimmed(); // 去掉首尾空格
Str1 = Str1.simplified(); // 去掉所有空格,中间连续的只保留一个
std::cout << Str1.toStdString().data() << std::endl; return a.exec();
}

1.1.6 字符串选取

使用 QString 类中的一些字符串操作方法,通过mid可以截取区间参数,当然remove也支持区间参数。

#include <QCoreApplication>
#include <QString>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); QString str1 = "hello lyshark !"; // 从索引2开始向后取10
str1 = str1.mid(2,10);
std::cout << str1.toStdString().data() << std::endl; //移除,1,3两个位置的字符
std::cout << (QString("123456").remove(1,3)).toStdString().data() << std::endl; // 超过 11 个字符就保留 11 个字符,否则不足替换为 '.'
std::cout << (QString("abcdefg").leftJustified(11,'.',true)).toStdString().data() << std::endl; return a.exec();
}

2.1 字符串查询与替换

2.1.1 查询字符串包含

在一个字符串中查询是否包含一个子串,这里通过使用Qt::CaseInsensitive指定不区分大小写,通过Qt::CaseSensitive指定为区分大小写,查询函数为contains保持不变。

#include <QCoreApplication>
#include <QString>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); QString str = "hello lyshark welcome admin";
int index;
bool ref; // 查询字符串中是否包含特定字符
ref = str.contains("lyshark",Qt::CaseInsensitive); // 不区分大小写
std::cout << ref << std::endl; ref = str.contains("LYSHARK",Qt::CaseSensitive); // 区分大小写
std::cout << ref << std::endl; return a.exec();
}

2.1.2 判断开头结尾

开头结尾的判断可以使用startsWithendsWith,在判断开头时通过Qt::CaseInsensitive标志定义,而结尾则使用Qt::CaseSensitive标志。

#include <QCoreApplication>
#include <QString>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); QString str = "hello lyshark welcome admin";
int index;
bool ref; // 判断是否以某个字符串开头或结束
ref = str.startsWith("hello",Qt::CaseInsensitive); // 判断是否hello开头
std::cout << ref << std::endl; ref = str.endsWith("lyshark",Qt::CaseSensitive); // 判断是否lyshark结尾
std::cout << ref << std::endl; return a.exec();
}

2.1.3 字符串位置查询

位置查询也是很常见的需求,我们可以使用indexOf()来查询最早出现某个字符的位置,当然也可以使用lastIndexOf()查询最后一次出现的位置,这两个函数接收一个字符串用作过滤条件。

#include <QCoreApplication>
#include <QString>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); QString str = "hello lyshark welcome admin";
int index;
bool ref; // 从字符串中取左边/右边多少个字符
index = str.indexOf(" "); // 第一个空格出现的位置
std::cout << str.left(index).toStdString().data()<< std::endl; index = str.lastIndexOf(" "); // 最后一个空格出现的位置
std::cout << str.right(str.size() - index - 1).toStdString().data() << std::endl; index = str.indexOf("r"); // 第一个出现r的位置
std::cout << str.left(index).toStdString().data()<< std::endl; return a.exec();
}

2.1.4 字符串替换

字符串的替换可以使用replace()函数,该函数接受两个参数第一个时需要替换的字符串,第二个是替换后的字符串。

#include <QCoreApplication>
#include <QString>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); QString str = "hello lyshark welcome admin";
int index;
bool ref; // 替换字符串中所有的lyshark为admin
str = str.replace("lyshark","admin");
std::cout << str.toStdString().data() << std::endl; return a.exec();
}

2.1.5 字符串截取

字符串的截取可以使用自带的section()函数,该函数接受三个参数,第一个是截取字符分隔符,第二和第三个是需要截取的字段,当然也可以通过灵活的利用left/mid/right/indexOf实现对字符串的截取。

#include <QCoreApplication>
#include <QString>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); // 字符串的截取
QString str1 = "uname,uage,usex";
std::cout << str1.section(",",0,0).toStdString().data() << std::endl;
std::cout << str1.section(",",1,1).toStdString().data() << std::endl; // 自己截取
QString str2 ="192.168.1.10";
std::cout << str2.left(str2.indexOf(".")).toStdString().data() << std::endl;
std::cout << str2.mid(str2.indexOf(".")+1,3).toStdString().data() << std::endl;
std::cout << str2.mid(str2.indexOf(".")+1,1).toStdString().data() << std::endl;
std::cout << str2.right(str2.size() - (str2.lastIndexOf(".")+1)).toStdString().data() << std::endl; // 切割字符串
std::cout << (QString("1,2,3,4,5,6").split(',')[2]).toStdString().data() << std::endl;
return a.exec();
}

2.1.6 字符串空判断

判断一个字符串是否为空,这个功能可以直接使用isNull/isEmpty函数来实现,如下是这三个函数的具体区别。

#include <QCoreApplication>
#include <QString>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); // 判断字符串是否为空
QString str4,str5="";
std::cout << str4.isNull() << std::endl; // 为空则为True
std::cout << str5.isNull() << std::endl; // \0不为空
std::cout << str5.isEmpty() << std::endl; // 为空则为False return a.exec();
}

3.1 字符串类型转换

3.1.1 大小写转换

与标准C语言一致,小写转为大写同样可以调用toUpper()函数实现,小写的话可以使用toLower()函数实现。

#include <QCoreApplication>
#include <QString>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); QString str = "uname,uage,usex";
QString int_str = "100,200,300"; // 大小写转换
str = str.toUpper(); // 转为大写
std::cout << str.toStdString().data() << std::endl;
str = str.toLower(); // 转为小写
std::cout << str.toStdString().data() << std::endl; return a.exec();
}

3.1.2 字符串与整数

字符串与整数的转换同样可以使用标准函数实现,例如将字符串转换为整数,我们首先可以使用section()截取字符串中的特定整数,接着使用toInt()将其转换为十进制整数,当然如果是十六进制可以传入16,而将整数转换为字符串可以通过setNum()实现直接转换。

#include <QCoreApplication>
#include <QString>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); QString str = "uname,uage,usex";
QString int_str = "100,200,300"; // 将字符串转为整数
bool flag = false;
QString x = int_str.section(",",0,0); // 提取出第一个字符串 int dec = x.toInt(&flag,10); // 转为十进制整数
std::cout << dec << std::endl; int hex = x.toUInt(&flag,16); // 转为十六进制数
std::cout << hex << std::endl; // 将整数转为字符串
int number = 100;
QString number_str; number_str = number_str.setNum(number,16); // 转为十六进制字符串
std::cout << number_str.toStdString().data() << std::endl; return a.exec();
}

当然了标准的QString容器内天生也自带转换功能,我们可以使用这些功能进行自定义转换,如下所示;

#include <QCoreApplication>
#include <QString>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); // 100 转16进制
std::cout << (QString::number(100,16)).toStdString().data() << std::endl; // 转换为 16 进制,不足 8 位前面补 ‘0’
std::cout << (QString("0%1").arg(123,8,16,QLatin1Char('0'))).toStdString().data() << std::endl; // 转为8进制
std::cout << QString("0%1").arg(QString::number(100,8)).toStdString().data() << std::endl;
std::cout << (QString("0%1").arg(QString::number(.777,'f',1))).toStdString().data() << std::endl; return a.exec();
}

3.1.3 格式化输出转换

浮点数与字符串的转换可以使用sprintf()格式化,也可以使用asprintf()格式化,这两个函数的区别是,QString::sprintf是在原始字符串上操作, QString::asprintf 允许创建一个格式化的字符串,并返回一个新的 QString 对象,而不是直接在现有对象中进行修改。

#include <QCoreApplication>
#include <QString>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); // 格式化输出转换
float total = 3.1415926;
QString str_total; // 将浮点数转换为字符串
str_total = str_total.sprintf("%.4f",total);
std::cout << str_total.toStdString().data() << std::endl; // 将双精度浮点数转为字符串
str_total = QString::asprintf("%2f",total);
std::cout << str_total.toStdString().data() << std::endl; return a.exec();
}

在这里需要多说一下类型转换,一般StdString()可以直接使用ToUTF8()转换格式,而QByteArray也可以直接使用StdString()函数将其转换成QString格式。

#include <QCoreApplication>
#include <QString>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); // 编码之间的转换
QString str_string = "welcome to you !"; // 将StdString转换为UTF8格式
QByteArray ba = str_string.toUtf8();
std::cout << ba.toStdString().data() << std::endl; // 类型转换QByteArray转换QString
QByteArray byte; byte.resize(2);
byte[0]='1';
byte[1]='2';
QString strs = byte;
std::cout << strs.toStdString().data() << std::endl; return a.exec();
}

C++ Qt开发:字符串QString容器的更多相关文章

  1. Qt比较字符串Qstring是否相等

    Qt比较字符串Qstring是否相等 QString str = "相等"; if(str ==QString::fromLocal8Bit("球形")) { ...

  2. 【Qt开发】QString与数字类型的转换(不同进制)

    把QString转换为 double类型 方法1.QString str="123.45"; double val=str.toDouble(); //val=123.45 方法2 ...

  3. Qt入门-字符串类QString

    原地址:http://blog.csdn.net/xgbing/article/details/7770854 QString是Unicode字符的集合,它是Qt API中使用的字符串类. QStri ...

  4. 用Qt开发第一个Hello World程序

    配置好Qt的环境变量之后,我们才可以进行下面的通过终端来使用Qt开发这个第一个程序 因为Qt的文件路径不能有中文否则会报错,所以一般都把工程文件都建立在根目录 我们创建的Qt程序包含两个部分:1.GU ...

  5. 基于QT开发的第三方库

    基于Qt开发的第三方库 分类: Qt2014-02-12 11:34 1738人阅读 评论(0) 收藏 举报 QT第三方库   目录(?)[+]   文章来源:http://blog.csdn.net ...

  6. Qt 开发 MS VC 控件终极篇

    Qt 开发 MS VC 控件终极篇 1. 使用 MSVC2015 通过项目向导创建 Qt ActiveQt Server 解决方案 项目配置:以下文件需要修改 1. 项目属性页->项目属性-&g ...

  7. Qt开发的程序在没有安装Qt环境的机器上可能出现的一些问题

    Qt开发的程序在没有安装Qt环境的机器上可能出现的一些问题,如:除png外的其它类型的图片,如:jpg.ico.bmp等,还有中文乱码等问题,出现这些问题的本质是Qt对这类文件格式或编码格式的支持方式 ...

  8. QT json字符串生成和解析

    1         QT json字符串生成和解析 1.1  QT Json解析流程 (1)  字符串转化为QJsonDocument QJsonParseError json_error; QJso ...

  9. 【Qt开发】QThread 实用技巧、误区----但文档中没有提到

    本文主要内容: 在任务一中,用 四 种方式实现:点击界面按钮,开线程运行一段程序,结果显示在一个Label上.1. 用不正确的方式得到看似正确的结果2. 用Qt Manual 和 例子中使用的方法3. ...

  10. QT开发之旅三串口设备调试工具

    这里首先说明一下,这个为什么叫串口设备调试工具而不是串口调试工具,是因为这个工具比网络上的串口调试工具多出了一些真实需要的用来调试设备的功能,首先一点就是大部分的串口调试工具收到数据都是立即返回,这样 ...

随机推荐

  1. 7.1 C++ STL 非变易查找算法

    C++ STL 中的非变易算法(Non-modifying Algorithms)是指那些不会修改容器内容的算法,是C++提供的一组模板函数,该系列函数不会修改原序列中的数据,而是对数据进行处理.查找 ...

  2. 2、搭建MyBatis

    2.1.开发环境 IDE:idea 2019.2 构建工具:maven 3.8.4 MySQL版本:MySQL 5.7 MyBatis版本:MyBatis 3.5.7 MySQL不同版本的注意事项 ( ...

  3. 《Kali渗透基础》05. 主动信息收集(二)

    @ 目录 1:端口扫描 2:UDP 扫描 2.1:Scapy 2.2:nmap 3:半开放扫描 3.1:Scapy 3.2:nmap 3.3:hping3 4:全连接扫描 4.1:Scapy 4.2: ...

  4. 从 DMAIC 方法论说起,记一个长链接 bug 的排查全过程

    引 本文是我在前端团队的第四次分享,在过去我曾做过一次关于 bug 排查的全流程的排查分析,文档:客户线上反馈:从信息搜集到疑难 bug 排查全流程经验分享,但这个文章更侧重我过去几年的排查经验,而非 ...

  5. 快手根据关键词取商品列表 API 返回值说明

    item_search-根据关键词取商品列表 注册开通 ks.item_search 公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) secr ...

  6. 《Python魔法大冒险》004 第一个魔法程序

    在图书馆的一个安静的角落,魔法师和小鱼坐在一张巨大的桌子前.桌子上摆放着那台神秘的笔记本电脑. 魔法师: 小鱼,你已经学会了如何安装魔法解释器和代码编辑器.是时候开始编写你的第一个Python魔法程序 ...

  7. 二叉树(binary tree)

    二叉树(binary tree) 二叉树(Binary Tree)是一种常见的树状数据结构,它由一组节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点.二叉树具有以下特点: 每个节点最多有 ...

  8. http、socket以及websocket的区别(websocket使用举例)

    一.http.socket.websocket介绍 1.HTTP(Hypertext Transfer Protocol):HTTP是一种应用层协议,用于在客户端和服务器之间传输超文本数据.它是基于请 ...

  9. 【NET 7.0、OpenGL ES】使用Silk.NET渲染MMD,并实时进行物理模拟。

    有关mmd播放器,网上也有许多非常漂亮的实现,如 pmxeditor.saba.blender_mmd_tools等等.. 首先我想先介绍下我参考实现的仓库: sselecirPyM/Coocoo3D ...

  10. Cplex求解教程(基于OPL语言,可作为大规模运算输入参考)

    最近导导让牛牛改篇论文,牛牛在她的指导下把非线性问题化成了线性.然鹅,化成线性后的模型决策变量和约束条件均达到上百甚至上千个,这让牛牛犯了难,以下方法或许能为这样大规模模型的变量和约束输入提供思路(๑ ...