前言:
这节很轻松,大家可以放心食用 ♪(・ω・)ノ
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(换行字符)进行分割。
然后再取子串进行添加,将其设置到行框上即可!
啊!终于完了,陌生人不知道你何时能看到,加油吧。
道阻且长,行则将至,我的成长之路。