一.字符编码1.字符编码概述QT解决不同编码相互转换问题QT在存储是Unicode ,输出是编码进行转换2.QString跨平台原理原本是UTF-8编译器是GBKWindows终端是GBKMAC、Linux是UTF-8所以VSCode可以改成GBK问题怎么方便的更改源码不变情况传统字符已经编码QT字符类QCharQString底层就是QChar通过Unicode中转UTF-8是QT中Unicode默认的编码如果给入的是GBK需要特殊的构造函数否则乱码原因UTF-8有自己的构造函数给的编码是GBK时会使用UTF-8的编码所以要自己设置一个构造函数例如QString str3 QString::fromLocal8Bithello你好;本地编码GBK的字符串转成 Qt 能正常显示的 QString防止中文乱码fromLocal8Bit的函数意思从本地 8bit 编码 转换字符转换的网站https://aichaxun.cn/unicode-char-lookup.html二.QString的内存结构和写时拷贝1.概念空间传递c用指针/引用传递QT自定义的容器类型COW写时拷贝值传递2.内存结构和写时拷贝深入解析修改前一个空间修改后另一个空间实时拷贝QString内部结构和COW效果初步初始化时x1,x2指向同一个空间当x2进行修改后x2有指向新空间这叫做写时拷贝内存结构constData()返回的是QChar*的返回值Datapointe是整个的地址多数用constData的空间数据空间写时拷贝写入时再拷贝一份x2指向新空间注意更改过后原空间是否继续维护在读数据释放时的特点x1释放了但是x2继续指向该空间所以给空间不消失三.QString的常用方法1.QString的构造方法和静态方法标准C的string也会用在QT中但是与用户交接时一定是QString静态成员函数返回值是QString动态构造方法是qDebug的写法仿照C语言sprintf写法提出QString::asprintf用法返回同样是字符串但是该方法打印有双引号工程不建议sprintf容易越界2.常用类型结构转换UTF-8字符风格转换方法一父子关系直接赋值方法二动态from方法静态from方法转换因为printf和qDebug同时使用控制台优先级缘故先打印“你好”添加UTF-8字符时的效果函数1QString::fromUtf8( , ) : 前者是空间名后者是长度2str1.toUtf8().constData()toUtf8()把 QString 转成 UTF-8 字节数组作用将 QString 内部的 UTF-16 字符转换成 UTF-8 编码的字节序列。返回值返回一个 QByteArray 类型的临时对象重点constData()获取 QByteArray 内部的字符指针作用返回 QByteArray 内部存储字节的首地址类型是 const char*C 风格字符串指针。注意这个指针不拥有内存只是 “指向” QByteArray 管理的内存 —— 一旦 QByteArray 被销毁指针就会指向已释放的内存悬空指针。整数风格转换函数1number(,) : 前者是空间名后者是进制数比如8进制2ToInt 第一个是判断是否转换成功的开关第二个是转换的进制数bool sFlag是一个 “开关”用来存储转换的成功 / 失败状态。sFlag是把开关的 “控制权” 交给 toInt 函数让它能修改开关的状态格式化风格转换两种方法第一种c语言风格:利用字符%s等含义搭配类函数QString::asprintf()使用第二种方法QString自己的先把const char *风格的转换成QString的%1、%2 是 Qt 字符串占位符同一个序号可以在字符串里多次出现会被同一个 arg() 参数替换比如这里的%2%1表示第 1 个要替换的位置%2表示第 2 个要替换的位置%1数字常见易错点序号不匹配序号不用连续函数.arg() : 替换这些占位符arg支持什么类型全部都支持自动转字符串丢进去即可3.增删改查3.1增加操作append:尾插法使用居多prepend:头插insert : 插入位置插入内容#include QApplication能创建并运行一个 Qt 图形界面程序#include QCoreApplication: 管理程序的事件循环处理定时器、网络请求、异步任务等只是没有界面相关的事件如鼠标点击3.2 是否为空的两个函数isEMpty():指的内容是否为空isNull(): QString().isNull() truesize() 字符个数count() 总个数contains(是否包含)3.3 删除尾删chop() :在原空间改变不支持链式调用从末尾开始删除里面填多少删多少个字符比如str(11111) chop(2) 打印str111任意位置删除:remove(14) :从头开始删除一共删除4个字符的位置全删除 clear()3.4 替换replace() :QString x Say yes!;QString y no;x.replace(4, 3, y);// x Say no!3.5 查找at front backindexof从头找第一个lastIndexOf(从尾找第一个)QString x sticky question;QString y sti;x.indexOf(y); // returns 0x.indexOf(y, 1); // returns 10x.indexOf(y, 10); // returns 10x.indexOf(y, 11); // returns -1只返回第一次遇到的相同字符的索引提取left(从左提取多少个) right mid(截断)都是返回新空间3.6读取Line控件的信息多和过滤操作组合QLineEdit*a...QString input a-text4.常用案例lastIndexOf这种的返回类型是qsizetype索引号leftpos: [0, pos) right(pos): 从右边数pos个符号提取mid(posa.size() num) : 表示[ posa.size() , posnum]从posa.size()开始截取num个字符逗号后面可以不写5.容器split返回的是容器类型链式容器用c的即可map底层红黑树键值对容器遍历方法索引方法STL迭代器风格QListQString list {A, B, C, D};for (auto i list.begin(), end list.end(); i ! end; i*i (*i).toLower();// 1. 顺序容器QListint arr1 {2, 3, 4, 7, 8, 9};for (auto x : arr1) {x 1;}int x;foreach(x, arr1) {qDebug() x;}// 2. 关联容器QMapQString, int res2;res2.insert(a1, 10);res2[w1] 30;res2[b1] 20;for (auto start res2.cbegin(), end res2.cend(); start ! end; start) {qDebug() start.key() : start.value();}QMap有序红黑树按照k值顺序QHash无序哈希表关联容器另一种遍历方法for (auto x: res2.keys()) {qDebug() x : res2[x];}