前言
前沿没啥要说的,这文章就是我看QT6开发指南和看b站up主爱编程的大丙qt视频说记录的笔记
1.1QString字符串操作
1.1.1QString简介
QString用来存储字符串,没有父类。存储的是一串字符,每个字符都是Qchar类型,,使用的是UTF-16编码,一个字符包含两个字节数据。对于超过65535的Unicode编码,QString使用两个连续的QChar字符表示。一个汉字是一个字符。
1.1.2QString字符串的创建和出初始化
//传递一个const char *类型的数据
QString str="hello QT";
1.1.3QString字符串的索引
使用[]或者接口函数at()访问每个字符
QString str="dimple,地灵殿";
qDebug()<<str<<'\n'; //dimple,地灵殿
QChar ch0=str[0];
qDebug()<<ch0<<'\n'; //'d'
QChar ch7=str.at(7);
qDebug()<<ch7<<'\n'; //'\u7075'按理来说应该输出一个’地‘
1.2QChar的功能
1.2.1QChar类的主要接口函数
函数原型 | 功能 |
---|---|
bool isDigit() const | 判断字符是否为0~9的数字 |
bool isLetter() const | 判断字符是否为字母 |
bool isLetterOrNumber() const | 判断字符是否为字母或数字 |
bool isLower() const | 判断字符是否为小写字母 |
bool isUpper() const | 判断字符是否为大写字母 |
bool isMark() const | 判断字符是否为记号 |
bool isNonCharacter() const | 判断字符是否为非文字字符 |
bool isNull() const | 判断字符编码是否为0X000,也就是“\0” |
bool isNumber() const | 判断字符是否为一个数,不仅仅包括0~9 |
bool isPrint() const | 判断字符是否为可打印字符 |
bool isPunct() const | 判断字符是否为标点符号 |
bool isSpace() const | 判断字符是否为分隔符,包括空格、制表符 |
bool isSymbol() const | 判断字符是否为特殊符号(打不出来啊) |
char toLatin1() const | 返回与QChar字符等效的Latin1字符 |
QChar toLower() const | 返回字符小写,不是字符就返回本身 |
QChar toUpper() const | 返回字符大写,不是字符就返回本身 |
char16_t unicode() const | 返回字符的16位Unicode编码数值 |
1.2.2QChar字符与Latin1字符转换
只有当QChar字符的编码为0~255时,函数toLatin1才有意义。
- 还有两种转换方式:
- 静态函数 QChar fromLatin1(char c)
- 构造函数 QChar(char ch)
QString str="dimple,地灵殿";
QChar chP=QChar::fromLatin1('P'); //静态函数,记得是单引号
//QChar chP=QChar('P') //构造函数
str[0]=chP;
qDebug()<<str<<'\n';
1.2.3QChar字符的Unicode编码
- 还有两种转换方式:
- 静态函数 QChar fromUcs2(char16_t c)
- 构造函数 QChar(char16_t ch)
QString str="dimple,地灵殿";
str[7]=QChar(0x9752); //‘青’
str[8]=QChar::fromUcs2(0x5C9B); //‘岛’
qDebug()<<str<<'\n';
不能直接传递大于255范围的数据,比如str[7]=QChar(‘青’);
1.2.4QChar的逻辑运算符
QString HuStr="河to湖"; //临时字符串,获取河和湖
QChar He=QChar::fromUcs2(HuStr[0].unicode());//获取‘河‘的UTF-16编码,再构造QChar字符
QChar Hu=QChar(HuStr[3].unicode()); //获取‘湖‘的UTF-16编码,再构造QChar字符
QString str="他们来着河南或者河北";
for(int i=0;i<str,sizr();i++) //循环每一个字符,把河替换为湖
{
if(str.at(i)==He)
{
str[i]=Hu;
}
}
1.3QChar主要功能测试
//每个字符的Unicode按钮
void Widget::on_pushButton_getchars_clicked()
{
QString str=ui->Editstr->text(); //读取输入的字符串
if(str.isEmpty()) //判断字符串是否为空
return;
ui->plainTextEdit->clear(); //清空文本框之前的内容
for(qint16 i=0;i<str.size();i++)
{
QChar ch=str.at(i); //获取单个字符
char16_t uniCode=ch.unicode(); //获取QChar字符的UTF-16编码
QString chStr(ch); //将QChar字符转换为QString字符串
QString info=chStr+QString::asprintf("\t,Unicode编码=0x%X",uniCode);
ui->plainTextEdit->appendPlainText(info);
}
}
//每个字符的特性判断
void Widget::on_pushButton_CharJudge_clicked()
{
QString str=ui->Editchar->text(); //读取输入的字符
if(str.isEmpty())
return;
QChar ch=str[0]; //提取第一个字符
char16_t uniCode=ch.unicode(); //获取QChar字符的UTF-16编码
QString chStr(ch); //将QChar字符转换为QString字符串
QString info=chStr+QString::asprintf("\t,Unicode编码=0x%X",uniCode);
ui->plainTextEdit->appendPlainText(info);
//使用QChar的接口函数判断字符的特性
ui->checkdigiit->setChecked(ch.isDigit());
ui->checkLetter->setChecked(ch.isLetter());
ui->checkLetterOrNumber->setChecked(ch.isLetterOrNumber());
ui->checkLower->setChecked(ch.isLower());
ui->checkMark->setChecked(ch.isMark());
ui->checkPunct->setChecked(ch.isPunct());
ui->checkSpace->setChecked(ch.isSpace());
ui->checkSymbol->setChecked(ch.isSymbol());
ui->checkUpper->setChecked(ch.isUpper());
}
//与Latinl的转换
void Widget::on_pushButton_ConvLatinl_clicked()
{
QString str=ui->Editstr->text(); //取输入框的内容
if(str.isEmpty()) //判断字符串是否为空
return;
ui->plainTextEdit->clear(); //清空输出框
for(int i=0;i<str.size();i++)
{
QChar ch=str.at(i).toLatin1(); //获取单个变换过的字符
ui->plainTextEdit->appendPlainText(ch); //输出变换过的字符
}
}
//与UTF-16的转换
void Widget::on_pushButton_ConvUTF16_clicked()
{
QString str=ui->Editstr->text(); //取输入框的内容
if(str.isEmpty()) //判断字符串是否为空
return;
ui->plainTextEdit->clear(); //清空输出框
for(int i=0;i<str.size();i++)
{
QChar ch=str.at(i); //获取单个字符
char16_t ch16=ch.unicode();
QString info=QString::asprintf("Unicode编码=0x%X",ch16);
ui->plainTextEdit->appendPlainText(info); //输出变换过的字符
}
}
/QChar的比较与替换
void Widget::on_pushButton_compare_clicked()
{
QString str=ui->Editstr->text(); //获取要被替换的字符串
QString str1=ui->Editchar->text(); //获取要被替换的字符
ui->plainTextEdit->clear(); //清空输出框
ui->plainTextEdit->appendPlainText(str);//输出原文,用来比较
QChar ch=str1[0];
QChar lin('A');
for(int i=0;i<str.size();i++)
{
if(str.at(i)==ch) //遍历字符串,将需要替换的替换为A
str[i]=lin;
}
ui->plainTextEdit->appendPlainText("\n"+str);
}
//清空文本框
void Widget::on_pushButton_Clear_clicked()
{
ui->plainTextEdit->clear();
}
1.4QString字符串的常用操作
1.4.1字符串拼接
使用加号运算符拼接
QString str1="洋洋",str2="得意";
QString str3=str1+str2;
qDebug()<<str3<<'\n';
使用append()在当前字符串后面添加字符串,函数prepend()在当前字符串前面添加字符串
QString str1="洋洋",str2="得意";
QString str3=str1;
str1.append(str2);
qDebug()<<str3<<'\n'; //洋洋得意
str3.prepend(str2);
qDebug()<<str3<<'\n'; //得意洋洋
1.4.2字符串截取
函数 | 作用 |
QChar front() const | 返回字符串第一个字符 |
QChar back() const | 返回字符串最后一个字符 |
QString left(qsizetype n) const | 提取左边n个字符 |
QString right(qsizetype n) const | 提取右边n个字符 |
QString first(qsizetype n) const | 提取前面n个字符,QT6 |
QString last(qsizetype n) const | 提取后面n个字符,QT6 |
QString mid(qsizetype pos,qsizetype n=-1) | 返回字符串中部分字符串 |
QString sliced(qsizetype pos, qsizetype n) const | 返回字符串中部分字符串,QT6 |
QString section(const QString &sep, qsizetype start, qsizetype end = -1, QString::SectionFlags flags = SectionDefault) const | 提取以sep做分隔符,从start到end段的字符串 |
1.4.3存储相关的函数
函数 | 作用 |
bool isEmpty() const | 判断字符串是否为空,区别在于只有未被赋值时isNull才返回true,例如空字符串(“\0”)就不行 |
bool isNull() const | |
qsizetype count() const | count不带参数就是统计字符个数,带参数的话可以统计某个字符串在当前字符串中出现的次数 |
qsizetype length() const | 返回字符串中的字符个数 |
qsizetype size() const | |
void clear() | 清空当前字符串 |
void resize(qsizetype size) | 改变字符串长度,大于则扩充,小于则缩减,多余字符丢失 |
QString &fill(QChar ch, qsizetype size = -1) | 将字符串替换为新内容,并可改变字符串长度 |
1.4.4搜索和判断
函数 | 作用 |
---|---|
qsizetype indexOf(const QString &str, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const | 在当前字符串查找某个字符首次和最后出现的位置,参数cs指的是是否区分大小写,CaseSensitive区分、CaseInsensitive不区分 |
qsizetype lastIndexOf(const QString &str, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const | |
bool contains(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const | 判断当前字符串是否包含某个字符串 |
bool endsWith(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const | 判断是否以某个字符串开头 |
bool startsWith(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const | 判断是否以某个字符串结尾 |
qsizetype count() const | 带参数的话可以统计某个字符串在当前字符串中出现的次数,可以统计是否区分大小写 |
1.4.5 字符串转换和修改
函数 | 作用 |
---|---|
QString toUpper() const | 全部转换为大写字母 |
QString toLower() const | 全部转换为小写字母 |
QString trimmed() const | 去掉字符串首尾空格 |
QString simplified() const | 不仅去掉字符串首尾空格,还会把中间连续空格用单个空格代替 |
void chop(qsizetype n) | 去掉字符串末尾n个字符 |
QString &insert(qsizetype position, const QString &str) | 在某个位置插入一个字符串 |
QString &replace(qsizetype pos, qsizetype n, const QString &after) | 从字符串pos位置开始替换n个字符,替换后的字符串的after,还可以实现替换某种字符串,可以设置是否区分大小写 |
QString &remove(qsizetype pos, qsizetype n) | 从pos位置开始移除n个字符,可以实现移除某种字符串 |
1.5QString字符串常用功能测试
只展示其中一段代码
void Widget::showBoolInfo(QString str, bool CheackValue)
{
if(CheackValue)
{
ui->plainTextEdit->appendPlainText(str+"=true");
}else{
ui->plainTextEdit->appendPlainText(str+"=false");
}
}
//这一段代码是isNull和isEmpty按钮的槽函数代码
void Widget::on_pushButton_4_clicked()
{
ui->plainTextEdit->appendPlainText("/n=======isNull()函数测试");
QString str1,str2="";
ui->plainTextEdit->appendPlainText("QString str1,str2""");
showBoolInfo("str1.isNull()",str1.isNull());
showBoolInfo("str1.isEmpty()",str1.isEmpty());
showBoolInfo("\nstr2.isNull()",str2.isNull());
showBoolInfo("str2.isEmpty()",str2.isEmpty());
str2.clear();
ui->plainTextEdit->appendPlainText("\n=====str2.clear()后");
showBoolInfo("\nstr2.isNull()",str2.isNull());
showBoolInfo("str2.isEmpty()",str2.isEmpty());
}
1.6QString字符串与数值转换
1.6.1字符串转换为整数和浮点数
函数 | 作用 |
---|---|
int toInt(bool *ok = nullptr, int base = 10) const | 把字符串转换为对应的返回值 |
uint toUInt(bool *ok = nullptr, int base = 10) const | |
long toLong(bool *ok = nullptr, int base = 10) const | |
ulong toULong(bool *ok = nullptr, int base = 10) const | |
short toShort(bool *ok = nullptr, int base = 10) const | |
ushort toUShort(bool *ok = nullptr, int base = 10) const | |
qlonglong toLongLong(bool *ok = nullptr, int base = 10) const | |
uqlonglong toULongLong(bool *ok = nullptr, int base = 10) const | |
float toFloat(bool *ok=nullptr) | |
double toDouble(bool *ok=nullptr) |
变量ok如果不为null,就作为是否转换成功的返回变量。false表示转换失败,true表示转换成功。
base表示转换的进制,也可以设置为0,使用c语言标示法。
1.6.2函数setNum()
函数setNum用于将整数或者浮点数转换为字符串
整数转化为字符串
QString &setNum(int n ,int base=10)
将整数n转换为字符串,base是转换为 什么进制的字符串
浮点数转化为字符串
QString &setNum(double n,char format='g',int precision=6)
n代表要转换的浮点数,format是格式字符,precision表示精度位数
格式字符 | 格式字符含义 | 精度位数的含义 |
---|---|---|
e | 科学计数法,用小写字母e | 基数的小数点后的有效位数 |
E | 科学计数法,用小写字母e | 基数的小数点后的有效位数 |
f | 自然计数法 | 小数点后的有效位数 |
g | 使用e或者f,那种简洁用哪种 | 小数点前后的数字位数之和 |
G | 使用E或者F,那种简洁用哪种 | 小数点前后的数字位数之和 |
1.6.3静态函数number()
该函数其参数形式与功能与成员函数setNum()相似
QString number(long n, int base = 10)
QString number(double n, char format = 'g', int precision = 6)
1.6.4静态函数asprintf()
用于构造格式化输出各种数据的字符串,类似于标准从语言的printf()函数
QString asprintf(const char *cformat, ...)
cformat是格式化字符串后面可以跟任意多个变量。
注意:替换格式化字符串%s只能用UTF_8编码的字符串,而且替换%s的只能是char*类型的字符串(使用(字符串).toLocal18Bit.data()达到这个效果)
1.6.5函数arg()
用于格式化输出各种数据的字符串,功能与asprintf()类似
//int输入数据的函数原型
QString arg(int a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char(' ')) const
a是要转换为字符串的整数
fieldWidth是转换成的字符串占用的最小空格数
base是转换成的字符串显示进制
fillchar是当fieldWidth大于实际数位宽度时使用的填充字符,默认使用空格
使用arg输出代表代表字符串的变量时字符串中可以有汉字