QT基础篇(2)QT5模板库,工具类及控件

1.字符串类

QT中的字符串类包括以下几种:

  1. QString类:是Qt中最常用的字符串类,用来存储Unicode字符。它支持各种字符串操作,例如连接、替换、截取等。

  2. QByteArray类:用来存储字节序列,适用于处理非Unicode的数据,如二进制数据或者网络传输的数据。

  3. QLatin1String类:用于表示Latin-1编码的字符串。

  4. QChar类:用来表示一个Unicode字符,可以用于操作单个字符。

  5. QStringList类:用来存储一组字符串,提供了常用的操作方法,如添加、删除、查找等。

  6. QRegularExpression类:用于支持正则表达式的匹配和操作。

这些字符串类都是QObject的子类,因此可以利用Qt的信号和槽机制来进行字符串操作。

操作字符串的方法:

在QT中,有很多方法可以进行字符串操作。下面是一些常用的方法:

  1. 字符串连接:使用QString的operator+运算符或append()方法可以将两个字符串连接起来。

    QString str1 = "Hello";
    QString str2 = "World";
    QString result = str1 + " " + str2; // "Hello World"
    

  2. 字符串截取:使用QString的mid()方法可以从字符串中获取指定位置和长度的子字符串。

    QString str = "Hello World";
    QString subStr = str.mid(6, 5); // "World"
    

  3. 字符串查找:使用QString的indexOf()方法可以查找子字符串在原字符串中的位置。

    QString str = "Hello World";
    int index = str.indexOf("World"); // 6
    

  4. 字符串替换:使用QString的replace()方法可以将一个子字符串替换为另一个字符串。

    QString str = "Hello World";
    str.replace("World", "QT"); // "Hello QT"
    

  5. 字符串拆分:使用QString的split()方法可以按照指定分隔符将字符串拆分成一个字符串列表。

    QString str = "Hello,World";
    QStringList list = str.split(","); // ["Hello", "World"]
    

  6. 字符串转换:使用QString的toUpper()和toLower()方法可以将字符串转换为全大写或全小写。

    QString str = "Hello World";
    QString upperCaseStr = str.toUpper(); // "HELLO WORLD"
    QString lowerCaseStr = str.toLower(); // "hello world"
    

  7. 字符串格式化:使用QString的arg()方法可以将字符串中的占位符替换为指定的值。

    QString str = "My name is %1. I am %2 years old.";
    QString formattedStr = str.arg("John").arg(25); // "My name is John. I am 25 years old."
    

这只是Qt中操作字符串的一些常见方法,还有很多其他的方法可以根据具体需求进行使用。

2.容器类

在QT中,提供了许多容器类,用于存储和操作数据。下面是一些常用的容器类:

  1. QList:用于存储和操作动态大小的元素列表。

    QList<int> list;
    list.append(1);
    list.append(2);
    list.append(3);
    

  2. QVector:和QList类似,但在随机访问元素时更高效。

    QVector<int> vector;
    vector.append(1);
    vector.append(2);
    vector.append(3);
    

  3. QLinkedList:用于存储和操作双向链表中的元素。

    QLinkedList<int> linkedList;
    linkedList.append(1);
    linkedList.append(2);
    linkedList.append(3);
    

  4. QSet:用于存储和操作无重复元素的集合。

    QSet<int> set;
    set.insert(1);
    set.insert(2);
    set.insert(3);
    

  5. QMap:用于存储和操作键值对的映射。

    QMap<QString, int> map;
    map.insert("One", 1);
    map.insert("Two", 2);
    map.insert("Three", 3);
    

  6. QHash:和QMap类似,但是不保证元素的顺序。

    QHash<QString, int> hash;
    hash.insert("One", 1);
    hash.insert("Two", 2);
    hash.insert("Three", 3);
    

以上只是QT中一些常用的容器类,还有其他一些容器类如QLinkedList、QStack、QQueue等,可以根据需要选择适合的容器类来存储和操作数据。

容器这里其实有序列容器和关联容器之分,上述中前三个属于序列容器,后面三个则属于关联容器

3.QVariant类

QVariant类是QT中用于在不同数据类型之间进行转换的通用类。它可以在不知道具体数据类型的情况下存储和操作数据。

QVariant类可以存储各种不同的数据类型,包括基本数据类型(整数、浮点数、布尔值等)、QString、QDate、QTime、QDateTime、QUrl等。它还可以存储用户自定义的数据类型,只要该数据类型提供了相应的类型转换函数。

使用QVariant类,可以方便地进行数据的转换和比较。下面是一些常见的QVariant的用法示例:

QVariant var;// 设置QVariant的值
var.setValue(42); // 设置为整数类型
var.setValue("Hello, World!"); // 设置为字符串类型// 获取QVariant的值
int intValue = var.toInt(); // 获取整数值(如果类型不匹配,返回0)
QString strValue = var.toString(); // 获取字符串值(如果类型不匹配,返回空字符串)// 检查QVariant的类型
if (var.type() == QVariant::Int) {// 处理整数类型
}// 检查QVariant的值是否为空
if (var.isNull()) {// 处理空值
}// 比较QVariant的值
QVariant var1 = 42;
QVariant var2 = 42.0;
if (var1 == var2) {// 值相同
}

需要注意的是,QVariant是一种类型安全的类,它会在进行类型转换时进行检查。如果尝试将一个不兼容的类型转换为QVariant,或者尝试从QVariant中获取一个不匹配的类型,都会导致错误。因此,在使用QVariant时,需要确保正确的类型转换和类型检查,以避免运行时错误。

4.算法及正则表达式

在QT5中,常用的算法可使用标准C++提供的算法库,例如 &lt;algorithm> 中的算法函数,如std::sortstd::find等。同时,QT5还提供了一些自己的算法类和函数,如QSortFilterProxyModelQRegularExpression等。

下面是一些常用的算法和正则表达式的示例:

  1. 排序算法:
#include <algorithm>
#include <vector>int main() {std::vector<int> numbers = {5, 3, 1, 4, 2};// 使用std::sort进行排序std::sort(numbers.begin(), numbers.end());// 输出排序后的结果for (int num : numbers) {qDebug() << num;}return 0;
}

  1. 查找算法:
#include <algorithm>
#include <vector>int main() {std::vector<int> numbers = {5, 3, 1, 4, 2};auto it = std::find(numbers.begin(), numbers.end(), 3);// 判断是否找到if (it != numbers.end()) {qDebug() << "找到了";} else {qDebug() << "未找到";}return 0;
}

  1. 正则表达式:
#include <QRegularExpression>int main() {QString str = "Hello,123World!";// 创建一个正则表达式匹配对象QRegularExpression regex("\\d+");// 判断是否匹配if (regex.match(str).hasMatch()) {qDebug() << "匹配成功";} else {qDebug() << "匹配失败";}return 0;
}

需要注意的是,正则表达式的语法和标准的正则表达式语法略有不同,请根据QT5的文档进行正确的使用。

控件这里就不细说了。大家有需要可以查阅QT官方手册,控件官方的说明是很全的

字符串概念解析:QString

隐式共享

在Qt中,QString类使用了一种称为"隐式共享"(implicit sharing)的技术,这是一种用于优化内存和性能的机制。

隐式共享的基本原理是,当一个QString对象被复制给另一个QString对象时,实际上并不会复制字符串的内容,而是共享同一个数据块。只有在其中一个对象被修改时,才会复制数据,以确保每个对象都有自己的独立副本。

这种机制使得字符串的复制操作非常高效,因为只有在需要修改字符串时才会进行实际的复制操作,而在大部分情况下只是简单地增加引用计数。

下面是一个示例,展示了QString的隐式共享机制:

QString str1 = "Hello";
QString str2 = str1; // 使用隐式共享,str2和str1实际上共享同一个数据块str1.append(", World!"); // 此时str1才会复制数据,因为需要修改字符串qDebug() << str1; // 输出 "Hello, World!"
qDebug() << str2; // 输出 "Hello"

需要注意的是,在某些情况下,隐式共享可能会导致一些问题。例如,如果修改一个QString对象的内容后,希望保持其与原始对象的独立性,可以使用QString::detach()函数,强制复制数据块。

QString的内存分配策略

在Qt中,QString的内存分配策略是使用动态分配的堆内存来存储字符串的内容。具体的内存分配过程如下:

  1. 当创建一个新的QString对象时,会为字符串的内容分配一个数据块,并将数据存储在该数据块中。

  2. 数据块中除了存储字符串内容外,还会包含一些额外的信息,例如字符串的长度、引用计数等。

  3. 当字符串被复制给另一个QString对象时,不会立即分配新的内存。而是将新的QString对象指向同一个数据块。这样,多个QString对象可以共享同一个数据块,实现了隐式共享。

  4. 当其中一个QString对象被修改后,会检查该对象的引用计数。如果引用计数大于1,即有其他对象共享同一个数据块,那么会进行数据的复制。这样,确保每个对象都有自己的独立副本。

  5. 当一个QString对象被销毁或不再需要时,会减少对数据块的引用计数。当引用计数减少到0时,内存会被释放。

这种动态分配的内存分配策略,使得QString对象的创建和销毁都非常高效,同时也减少了内存的消耗。另外,隐式共享的机制也使得字符串的复制和传递操作变得更加高效。

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

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

相关文章

计算机网络 物理层

文章目录 物理层物理层的基本概念数据通信的基础知识数据通信系统的模型有关信道的几个基本概念信道的极限容量 物理层下面的传输媒体导引型传输媒体非引导型传输媒体 信道复用技术波分复用码的复用 宽带接入技术ADSL 技术光纤同轴混合网 (HFC 网&#xff09;FTTx 技术 物理层 …

爬虫01-爬虫原理以及爬虫前期准备工作

文章目录 1 爬虫基本原理什么是爬虫爬虫功能详解爬虫基本流程两个概念&#xff1a;request和response 2 一些问题爬虫能抓取什么样的数据&#xff1f;抓取的数据怎么提取部分内容&#xff1f;数据解析方式。为什么我爬虫抓取的数据和浏览器看到的不一样怎样解决JavaScript渲染的…

阿里云弹性计算技术公开课-ECS 安全季 全新上线!

云布道师 如何保障云上业务的应用安全和数据安全&#xff0c;是每一个上云的企业和用户关注的重点。云上安全建设是一个体系化工程&#xff0c;需要用户主动进行多方面的考虑和实施&#xff0c;包括制定完善的安全策略和规范&#xff0c;如身份认证、访问控制、漏洞管理、安全…

超实用的公众号内容制作流程,小白也能轻松学会

公众号是以内容为王的平台&#xff0c;保持优质原创内容发布可以给公众号带来源源不断的流量&#xff0c;稳定输出内容&#xff0c;会获得平台的流量扶持。 很多小伙伴运营公众号都没有什么阅读量&#xff0c;一方面是公众号内容同质化越来越严重&#xff0c;另外一方面是公众…

编程笔记 html5cssjs 030 HTML音频

编程笔记 html5&css&js 030 HTML音频 一、<audio>元素二、属性三、事件三、使用 CSS 设置样式练习小结 有时候网页上也需要嵌入音频。比如播放歌曲或老师讲课的音频等。 一、<audio>元素 <audio> HTML 元素用于在文档中嵌入音频内容。<audio>…

寒假刷题第四天

PTA甲级 1017 Queueing at Bank 可以使用小顶堆模拟窗口的情况&#xff0c;一定是最小的时间的窗口先空出来 #include<iostream> #include<algorithm> #include<queue> #include<vector>using namespace std;struct people {int time;int process; …

完全卸载grafana

查看要卸载的包的名字 yum list installed yum remove grafana-enterprise.x86_64 成功

【tensorflowflutterweb】机器学习模型怎样用到前端上(未写完)

书接上回 在上一章 我们谈了怎么根据项目需求构建一个简单的机器学习模型。 ​​​​​​ ​​​​​​【tensorflow&flutter】自己写个机器学习模型用在项目上&#xff1f;-CSDN博客文章浏览阅读852次&#xff0c;点赞22次&#xff0c;收藏15次。【tensorflow&flutter…

【2023 - 探索】博0到博1,游戏新地图的探索日志

【2023 - 探索】博0到博1&#xff0c;游戏新地图的探索日志 写在最前面CSDN探索日志2023的探险 探索日志年终回顾探索 冒险回顾实习6月开始跟着老师做科研年中的一些其他事情9月开始上课开学后11月&#xff0c;读者互动 新年展望新年祝福 写在最前面 2023&#xff0c;我解锁了新…

C语言——结构体类型(二)【结构体内存对齐,结构体数组】

&#x1f4dd;前言&#xff1a; 上一讲结构体类型&#xff08;一&#xff09;中&#xff0c;我们讲述了有关结构体定义&#xff0c;创建&#xff0c;初始化和引用的内容&#xff0c;这一讲&#xff0c;我们进一步学习结构体的相关知识&#xff1a; 1&#xff0c;结构体内存对齐…

腾讯云2024年优惠券领取入口汇总

腾讯云是国内知名的云计算服务提供商&#xff0c;提供了包括云服务器、云数据库、云存储、人工智能等全方位的云服务。为了吸引更多的用户&#xff0c;腾讯云经常会推出各种优惠券&#xff0c;让用户在购买云服务时能够享受到更多的优惠&#xff0c;下面给大家整理汇总最新腾讯…

独享静态代理IP在海外市场调研中的独特优势

独享静态代理IP在海外市场调研中扮演着至关重要的角色&#xff0c;提供了一系列无可比拟的优势。独享静态代理IP的稳定性和可靠性对于长期的市场调研至关重要&#xff0c;它保证了连接的持续性和数据的准确性。通过这些方面的综合优势&#xff0c;独享静态代理IP成为海外市场调…

【华为OD机试真题2023CD卷 JAVAJS】矩阵匹配

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 矩阵匹配 知识点二分查找DFS搜索 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 从一个N*M(N<=M)的矩阵中选出N个数,任意两个数字不能在同一行或同一列,求选出来的N个数中第K大的数字的最小值是多少。…

每日一看大模型新闻(2023.11.20)

1.产品发布 1.1长虹&#xff1a;首个基于大模型的智慧家电AI平台 发布日期&#xff1a;2023.11.20 全球首个基于大模型智慧家电AI平台长虹云帆震撼发布&#xff01; 主要内容&#xff1a;长虹智慧AI平台发布会上&#xff0c;发布了全球首个基于大模型的智慧家电AI平台——长…

靜態住宅IP代理詳解(ISP代理)

IP地址如同我們的網路身份證&#xff0c;是我們在互聯網世界中的標識。而在這個廣闊的網路世界中&#xff0c;有一種特殊的IP地址——靜態住宅IP&#xff0c;它就像我們的網路“定居地”。 靜態住宅IP是什麼&#xff1f; 靜態住宅IP&#xff0c;顧名思義&#xff0c;是一種固定…

使用Rider C# Dll工程和Unity工程互相调用、断点方法

总体流程 创建C# Dll工程&#xff0c;生成C#工程Dll 创建Unity工程 Unity调用C#工程的代码 C#工程调用Unity工程的代码 断点方法 创建C# Dll工程&#xff0c;生成C#工程Dll 创建工程 选这个&#xff0c;注意UnityEngineDll这个选项&#xff0c;要选你目标unity版本的Dll…

R语言生物群落(生态)数据统计分析与绘图教程

详情点击链接&#xff1a;R语言生物群落&#xff08;生态&#xff09;数据统计分析与绘图教程 前沿 R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂&#xff0c;涉及众多统计分析方法。 一&#xff1a;R和Rstudio及入门和作…

【数据结构】7大排序最详细

0.前言 接下来进入排序&#xff0c;我们知道在c语言阶段可能就学习过了像冒泡排序&#xff0c;选择排序这种比较简单的排序&#xff0c;那么接下来我们就会学习到更加高级的排序算法。但高级代表着难度的提升&#xff0c;但不用担心&#xff0c;博主会细细来谈&#xff0c;慢慢…

202312 青少年软件编程(C/C++)等级考试试卷(四级)电子学会真题

2023年12月 青少年软件编程&#xff08;C/C&#xff09;等级考试试卷&#xff08;四级&#xff09;电子学会真题 1.移动路线 题目描述 桌子上有一个m行n列的方格矩阵&#xff0c;将每个方格用坐标表示&#xff0c;行坐标从下到上依次递增&#xff0c;列坐标从左至右依次递增…

为什么要做FP独立站?FP独立站有哪些优势?

近年来&#xff0c;跨境电商的商家们面临越来越大的平台政策压力&#xff0c;商家们纷纷把眼光聚焦到独立站上&#xff0c;眼下独立站已经成为出海卖家的标配。 特别是想做FP商品的卖家&#xff0c;相对于亚马逊平台&#xff0c;独立站才是你们的最终出路... 那么&#xff0c;问…