前言:
这节很轻松,大家可以放心食用 ♪(・ω・)ノ
QString目录
- 一.与c++String的区别
- 二.隐式共享
- 三.初始化
- 四.判断是否为空串
- 五.字符串的长度
- 六.添加字符串
- 1.尾加
- 2.任意位置加
- 七.替换字符串
- 八.修改字符串
- 九.删除字符串
- 1.清空
- 十.获取子串
- 1.任意位置获取
- 2.左获取
- 3.右获取
- 十一.分割字符串
- 十二.转换成c语言字符串
- 十三.类型转换
- 1.字符串转整数
- 2.字符串转小数
- 十三.小项目 ‘藏头诗’
一.与c++String的区别
c++字符串的每个字符,占一个字节
但是QString每个字符占两个字节。
这样就完美解决了汉字占两个字节的问题。
内存变大了,自然好处少不了
隐式共享就是再此基础上完成的
二.隐式共享
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QString str1="姚国林";QString str2=str1;//拷贝构造函数,默认浅拷贝qDebug()<<str1;qDebug()<<str2;str2[2]='A';//深拷贝,不然str1的值也会被改变qDebug()<<str1;qDebug()<<str2;str1=str2;//str1又指向str2,str1的内存自动销毁qDebug()<<str1;qDebug()<<str2;
}MainWindow::~MainWindow()
{delete ui;
}
运行结果:

想必大家对结果并不意外,最要是内部的实现机制,你知道嘛?不慌下面给大家画一个图!

QString会多一个用来记录指针指向的计数器
当我们用str1初始化str2时,会做一个浅拷贝,学过c++的应该都知道,就是指针也指向同一块内存。
对srt2的值进行修改,如果是浅拷贝,则str1也会被修改,此时,str2会做一个深拷贝,重新开辟一块内存。
如果现在又让str2赋值给str1,则str2的计数器为2,str1的计数器为0,就会自动销毁这一块内存。
所以说QString这种隐式共享也被称之为写时复制,会大大的节省开销,如果一样就指向同一块内存,如果不一样,就马上开辟一块内存。
三.初始化
可以用=,或者()来进行初始化

运行结果:

四.判断是否为空串
关键字:isEmpty()

运行结果:

值得注意的是 “” 是空串,但是 " " 不是空串!
五.字符串的长度
三个接口:size(),count(),size()

运行结果:

六.添加字符串
1.尾加
对字符串进行+=即可

运行结果:

还可以append()

运行结果:

哈哈你们是大帅哥吗?是的话,评论一个是!
2.任意位置加
用insert()

运行结果:

我真滴服了,我明明是大帅哥。

运行结果:

当添加的位置大于原来字符串时,中间会自动补空格。
七.替换字符串
用replace()

运行结果:

默认是区分大小写的!可以加一个Qt::CaseInsensitive不区分大小写替换

运行结果:

八.修改字符串
直接可以用下标进行修改

运行结果:

九.删除字符串
用remove()

运行结果:

可以指定位置删除,也可以直接查值删除!
1.清空
用clear()

运行结果:

十.获取子串
1.任意位置获取
mid()
运行结果:

2.左获取
left()

运行结果:

3.右获取
right()

运行结果:

十一.分割字符串
用split(),返回值是一个QStringList容器,后面会讲…

运行结果:

十二.转换成c语言字符串
先转换成标准字符串(toStdString())再转换成c语言的字符串(c_str())
十三.类型转换
1.字符串转整数
toInt(bool,进制)

运行结果:
有字母的转换失败!

还可以转换成16进制:

运行结果:

123的16进制就是291

2.字符串转小数
toDouble()

运行结果:

其他类型转换同理!
十三.小项目 ‘藏头诗’
OK,光说不练假把式,现在我们就来做一个自己的小项目。
先看效果:

点击生成:

哈哈,事不宜迟,我们开始吧
首先ui设计器去设计界面,用到Label,Text Edit,Push Button,Line Edit 这几个组件

然后在按钮用转到槽
#include <QMessageBox>
...
void MainWindow::on_pushButton_clicked()
{if(ui->textEdit->toPlainText().isEmpty()){QMessageBox::information(this,"提示","文本为空,请输入文本",QMessageBox::Ok);}else{QString str=ui->textEdit->toPlainText();QStringList list=str.split('\n');QString ret;for(int i=0;i<list.size();i++){ret+=list[i].left(1);}ui->lineEdit->setText(ret);}}
首先判断文本是否为空,为空就出现提示框

然后将所有文本添加到字符串中,用\n(换行字符)进行分割。
然后再取子串进行添加,将其设置到行框上即可!
啊!终于完了,陌生人不知道你何时能看到,加油吧。
道阻且长,行则将至,我的成长之路。
