C++ Qt开发:字符串QString容器

在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();
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java9及之后关于类加载器的新特性

为了保证兼容性&#xff0c;JDK9没有从根本上改变三层类加载器的架构和双亲委派模型&#xff0c;但为了模块化系统的顺利运行&#xff0c;仍然发生了一些值得被注意的变动。 一、变动1 由于引入了模块化概念&#xff0c;所以不同的类加载器回去加载属于不同模块的类 启动类加…

打工人副业变现秘籍,某多/某手变现底层引擎-Stable Diffusion简介

Stable Diffusion是2022年发布的深度学习文本到图像生成模型,它主要用于根据文本的描述产生详细图像,尽管它也可以应用于其他任务,如

使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题

文章目录 一、 篇头二、 操作步骤2.1 编译AOSP AS工程文件2.2 将AOSP导入Android Studio2.3 切到Project试图2.4 等待index结束2.5 下载缺失的JDK 1.82.6 导入完成 三、 导入AS的好处3.1 本文案例演示源码编译错误AS对比同文件其余地方的调用AS错误提示依赖AS做错误修正 一、 篇…

字符串函数strtok

1.调用格式&#xff1a; 2.调用形式&#xff1a;char*strtok(char*p1,const char*p2),其中第二个是由分隔符组成的字符串&#xff0c;第一个为需要分隔的字符串 3.调用目的&#xff1a;将分隔符之间的字符串取出 4.调用时一般将源字符串拷贝后调用&#xff0c;因为此函数会将…

键盘打字盲打练习系列之循序渐进——4

一.欢迎来到我的酒馆 盲打&#xff0c;循序渐进&#xff01; 目录 一.欢迎来到我的酒馆二.继续练习二.矫正坐姿 二.继续练习 前面的章节&#xff0c;我们重点向大家介绍了主键盘区指法和键盘键位。经过一个系列的教程学习&#xff0c;相信大家对盲打这项技能已经掌握得差不多了…

金融量化交易:使用Python实现遗传算法

大家好&#xff0c;遗传算法是一种受自然选择过程启发的进化算法&#xff0c;用于寻找优化和搜索问题的近似解决方案。本文将使用Python来实现一个用于优化简单交易策略的遗传算法。 1.遗传算法简介 遗传算法是一类基于自然选择和遗传学原理的优化算法&#xff0c;其特别适用…

数据分析实例:基于电力大数据的中小型企业运营发展分析

前不久&#xff0c;帆软发起了【2023BI数据分析大赛】的活动&#xff0c;老李我也是这个大赛的评委。   今天跟大家分享的是基于电力大数据的中小型企业运营发展分析。 当我们去解读一份数据分析报告时&#xff0c;首先要了解这份报告的主要目的是什么&#xff0c;作者通过分…

mapbox使用v3版本,v2的样式切换不同时间段

创建DayAndNight.js /*** 使用方式* const dayNight new DayAndNight({ map: map // map 地图对象}) * 修改类型* dayNight.setConfigProperty(value)*/ class DayAndNight {constructor (sdMap) {this.map sdMap.mapthis.initStyle()}// 初始化时添加必要样式initStyle () {…

vue中设置滚动条的样式

在vue项目中&#xff0c;想要设置如下图中所示滚动条的样式&#xff0c;可以采用如下方式&#xff1a; ​// 直接写在vue.app文件中 ::-webkit-scrollbar {width: 3px;height: 3px; } ::-webkit-scrollbar-thumb { //滑块部分// border-radius: 5px;background-color: #1890ff;…

excel数据重复率怎么计算【保姆教程】

大家好&#xff0c;今天来聊聊excel数据重复率怎么计算&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; excel数据重复率怎么计算 在Excel中计算数据重复率可以通过以下步骤实现&#xff1a; 1. 确定重复…

Java并发编程-synchronized、volatile、AQS解析

Java并发编程 synchronized 如何保证线程安全 JDK1.6 之前&#xff0c;synchronized 是一个重量级锁相比于JUC的锁显得非常笨重&#xff0c;存在性能问题 JDK1.6 及之后&#xff0c;Java 对 synchronized 进行的了一系列优化&#xff0c;性能与 JUC 的锁不相上下 synchroni…

python源码,在线读取传奇列表,并解析为需要的JSON格式

python源码&#xff0c;在线读取传奇列表&#xff0c;并解析为需要的JSON格式 [Server] ; 使用“/”字符分开颜色&#xff0c;也可以不使用颜色&#xff0c;支持以前的旧格式&#xff0c;只有标题和服务器标题支持颜色 ; 标题/颜色代码(0-255)|服务器标题/颜色代码(0-255)|服务…

WPF使用WebBrowser页面白屏,不显示渲染页面问题排查

前言 WPF使用WebBrowser页面白屏&#xff0c;不显示渲染页面问题排查 代码 <Window x:Class"WpfApp1.Window5"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"x…

Kubernetes入门笔记 ——(3)理解pod对象

为什么需要pod 最为熟知的一句话&#xff1a;pod是k8s的最小调度单位。刚开始听到这句话时会想&#xff0c;已经有容器了&#xff0c;k8s为什么还要搞个pod出来&#xff1f;容器和pod是什么关系&#xff1f;容器的本质是进程&#xff0c;而k8s本质上类似操作系统。 熟悉Linux的…

在git使用SSH密钥进行github身份认证学习笔记

1.生成ssh密钥对 官网文档&#xff1a;Https://docs.github.com/zh/authentication&#xff08;本节内容对应的官方文档&#xff0c;不清晰的地方可参考此内容&#xff09; 首先&#xff0c;启动我们的git bush&#xff08;在桌面右键&#xff0c;点击 Git Bush Here &#xf…

SystemVerilog学习(0)——目录与传送门

一、验证导论 SystemVerilog学习&#xff08;1&#xff09;——验证导论-CSDN博客文章浏览阅读403次。SystemVerilog自学&#xff0c;验证系统概述&#xff0c;什么是SVhttps://blog.csdn.net/apple_53311083/article/details/133953016 二、数据类型 SystemVerilog学习&…

非标设计之气缸的选型三

一、气缸正确安装方式&#xff0c;气缸调试注意事项 气缸安装方式&#xff1a; 气缸正确安装方式&#xff1a; NB(无支架) FB(脚座支架) FR(法兰) FA(前法兰) FB(后法兰) SC(单耳支架) DC(双耳支架) CT(耳轴支架) 气缸的安装形式决定方法&#xff1a;根据负荷运动方向决定气缸…

二百一十二、Flume——Flume实时采集Linux中的目录文件写入到HDFS中(亲测、附截图)

一、目的 在实现Flume实时采集Linux中的Hive日志写入到HDFS后&#xff0c;再做一个测试&#xff0c;用Flume实时采集Linux中的目录文件&#xff0c;即使用 Flume 监听Linux整个目录的文件&#xff0c;并上传至 HDFS中 二、前期准备 &#xff08;一&#xff09;安装好Hadoop、…

微信个人号机器人开发

简要描述&#xff1a; 取消消息接收 请求URL&#xff1a; http://域名地址/cancelHttpCallbackUrl 请求方式&#xff1a; POST 请求头Headers&#xff1a; Authorization&#xff1a;login接口返回Content-Type&#xff1a;application/json 无参数 返回数据&#xff…

PADS9.5封装库转换为AD库

1、打开PADS Layout&#xff0c;File – Library&#xff0c;选中usr&#xff0c;如下图&#xff1a; 2、封装– 导入&#xff0c;选中你的 .d后缀文件(也就是PADS的封装文件)&#xff0c;打开。 3、元件 – 新建 – PCB封装 - 分配 - 确定。 4、&#xff0c;选择“斜线”…