Qt编程基础:认识常用的基本类型


theme: cyanosis

本文正在参加「金石计划 . 瓜分6万现金大奖」

前言

上一节已经成功创建了一个Qt项目,接下来就是要在创建好的项目中,添加自己想要的功能。在写代码之前,我们需要掌握Qt的一些基础知识。

语法部分就不用讲了,这系列文章是对有C或C++语言基础的同学展开的,如果一点编程基础都没有的同学,也可以在后续实操文章中,跟着文章一点一点学习和积累语法知识。

和C/C++不同的是,Qt封装了一些自己的基本数据类型和方法。所以我们要想进行Qt编程,就要先掌握一些基本的数据类型,以及它们的使用方法,这在我们后续编程中会用到。

还有一点要说明的是,在Qt项目开发过程中,C++提供的数据类型还有一些系统函数都是可以使用的,只要包含对应的头文件就可以了。但是当我们在使用Qt提供的方法时,它的参数类型很多都是Qt的一些基本数据类型,所以我们还是要掌握的。

QByteArray

QByteArray是字符数组类,字节数组类是一个提供字节数组的类,它可以一位一位的访问数组中的字符。

它可以对应char*这个类去学习。QByteArrary这个类经常在串口通信中使用,因为串口通信数据都是一个一个的8位字节流,所以使用QByteArray就很方便。对于QByteArray的操作,主要需要掌握的操作有以下几种。

直接上代码:

初始化

QByteArray ba("Hello"); // "Hello"
或
QByteArray ba;
ba.resize(5);
ba[0] = 'H';
ba[1] = 'e';
ba[2] = 'l';
ba[3] = 'l';
ba[4] = 'o'; // "Hello"
或
QByteArray ba;
ba.fill('O', 2);// "OO"
//初始化时重点注意QByteArray的大小,和每一位的赋值。

访问某个元素

QByteArray ba("Hello");
qDebug() << ba[0]; // "H"
或
qDebug() << ba.at(1); // "e"
//访问某个元素时重点注意取得位数是否正确,第一位对应的值为0。

截取字符串

QByteArray x("Pineapple");
QByteArray y = x.left(4);  // y=="Pine"
或
QByteArray y = x.right(5); // y=="apple"
或
QByteArray y = x.mid(4,3); // y=="app"
QByteArray y = x.mid(4);   // y=="apple"
//用mid方法从字符串中间截取时,第一个参数是起始位置,索引值从0开始;
//第二个参数是截取的位数,如果不写第二个参数,就会一直截取到最后。

获取字节数组的大小

QByteArray ba("Hello");
int n = ba.size();   // n==5
int n = ba.length(); // n==5
int n = ba.count();  // n==5
//这三个方法除了名字不一样,其实是一样的。

转换为其他类型

//转int
QByteArray strInt("1234");
int n = strInt.toInt(); // n==1234

//转folot
QByteArray strFloat("1234.56");
float f = strFloat.toFloat(); // f==1234.56
double d = strFloat.toDouble(); // d==1234.56

//转char*
QByteArray ba("Hello world");
char* data = ba.data(); 

//QByteArray与std::string互转
QByteArray ba("Hello");
std::string str = ba.toStdString();  // QByteArray转std::string
std::string str("world");
QByteArray ba = QByteArray::fromStdString(str); // std::string转QByteArray

//QByteArray与QString互转
QString str = QString("hello world!");
QByteArray arr = str.toLatinl(); // QString转QByteArray
QByteArray arr("abc123");
QString str = arr; // QByteArray转QString

向前搜索和向后搜索

QByteArray ba("sticky question");
int n = ba.indexOf("sti"); // n=0,默认从头搜索,返回sti出现的位置为0
int n = ba.indexOf("sti", 1); // n=10,从第1位开始搜索,返回sti出现的位置为10

int n = ba.lastIndexOf("sti"); // n=10,默认从最后一位(-1)开始反向搜索,返回sti出现的位置为10
int n = ba.lastIndexOf("sti", 9); // n=0,从第9位开始反向搜索,返回sti出现的位置为0

插入

QByteArray ba("Meal");
ba.insert(1, QByteArray("ontr")); // ba=="Montreal"

QString

QString是字符串类,是一个很常用的数据类型。它可以对应string类型去理解,我们常用到的就是对QString的操作有以下几种。

直接上代码:

初始化及赋值

QString str("Hello");
QString str = "Hello";

访问某个元素

QString str("Hello");
QChar ch = str.at(4); // ch=='o'

获取长度

QString str("ni好");
int n = str.count();  // n=3
int n = str.size();   // n=3
int n = str.length(); // n=3
//这三个方法是相同的,都返回字符串中字符的个数,如果字符串中有汉字,一个汉字算一个字符。

字母大小写转换

QString str1 = "Hello,World";
QString str2 = str1.toUpper(); //str2="HELLO,WORLD"
QString str2 = str1.toLower(); //str2="hello,world"

移除字符

QString str = "hello,world";
QString temp = str.remove(2, 4); //str="heworld"  temp="heworld"

添加字符串

QString str1 = "Hello", str2 = "world";
QString str3 =str1;
str1.append(str2);  // str1=="Helloworld"
str3.prepend(str2); // str3=="worldHello"

QString str = QString("%1 was born in %2.").arg("Joy").arg(1993); //"Joy was born in 1993."
//QString::arg()是一个很好的字符串组合方法,它可以处理很多种数据类型。
//其中%1被替换为第一个arg()的参数,%2被替换为第二个arg()的参数。

去掉空格

QString str1 = " Are \t you \n OK? ",str2;
str2 = str1.trimmed(); // str2=="Are \t you \n OK?" 去掉首尾空格
str2 = str1.simplified(); //str2=="Are you OK?" 去掉首尾空格,中间连续的空格会用一个空格来替换

查找字符串

QString str1 = "sticky question";
int n = str1.indexOf("sti"); // n=0,默认从头搜索,返回sti出现的位置为0
int n = str1.indexOf("sti", 1); // n=10,从第1位开始搜索,返回sti出现的位置为10

int n = str1.lastIndexOf("sti"); // n=10,默认从最后一位(-1)开始反向搜索,返回sti出现的位置为10
int n = str1.lastIndexOf("sti", 9); // n=0,从第9位开始反向搜索,返回sti出现的位置为0

int n = str1.find("sti", 0); // n=0,第二个参数表示位置index,如果index为0,从第一位开始找;
//如果index为-1,从倒数第一位开始找;如果index为-2,从倒数第二位开始找。

判断字符串是否为空

QString str1, str2 = "";
bool b = str1.isNull(); //b==true,未赋值字符串变量
bool b = str2.isNull(); //b==false,只有“\0”的字符串也不是Null
bool b = str1.isEmpty();//b==true
bool b = str2.isEmpty();//b==true

判断是否包含某个字符串

QString str1 = "Hello world";
bool b = str1.contains("world"); // b==true
bool b = str1.contains("WORLD", Qt::CaseInsensitive); // b==true,不区分大小写
bool b = str1.contains("WORLD", Qt::CaseSensitive); // b==false,区分大小写

判断是否以某个字符串开头或结尾

QString str1 = "Hello, world!";
bool b = str1.startsWith("HELLO", Qt::CaseInsensitive); // b==true,不区分大小写 
bool b = str1.endsWith("WORLD!", Qt::CaseSenstive); // b==false,区分大小写

截取字符串

QString str1="姓名,男,1990-3-4,汉,南京", str2;
int n = str1.indexOf(","); // n=2,第一个","出现的位置
str2 = str1.left(n); // str2=="姓名"

int n = str1.lastIndexOf(","); // n=15,最后一个逗号出现的位置
str2 = str1.right(str1.size()-n-1); // str2=="南京",提取最后一个逗号之后的字符串

QString x = "Nine apples";
QString y = x.mid(5, 3); // y=="app"
QString y = x.mid(5); // y=="apples"

将字符串转类型转换成其他基本数据类型

//转int
QString strInt = "1234";
int n = strInt.toInt(); // n==1234

//转folot
QString strFloat = "1234.56";
float f = strFloat.toFloat(); // f==1234.56
double d = strFloat.toDouble(); // d==1234.56

字符串的比较

int n = QString::compare("def", "abc"); // n>0
int n = QString::compare("abc", "def"); // n<0
int n = QString::compare("abc", "abc"); // n=0

截断字符串

QString str1 = "Hello world";
QString str2 = str1.truncate(1); // str2=="He",从位置1开始截断
QString str2 = str1.chop(6); // str2=="Hello"截断最后6个字符

QStringList

QStringList是字符串列表类,是Qt容器类中的一种。其实是从QList<QString>继承来的,就是一个字符串类型的列表,因为这个类型使用比较频繁,所以封装成一个单独的类型来使用。我们经常用到这个类型的操作有以下几种。

QVector

QVector是Qt容器类中的一种。QVector是占用连续的内存控件存储给定类型的值的一个数组。QVector和QList容器中的数据都是一个接一个线性存储的,所以称为顺序容器。区别在于QList实质上是链表,QVector实质上是数组。所以在QVector前面或者中间插入项目是非常缓慢的,因为这样可能导致大量的项目在内存中移动一个位置。

我们可以对比std::vector去理解这个类。它是一种STL风格迭代器的容器类。我们经常用到的对QVector的一些操作主要有以下几种。

QMap

QMap也是容器类的一种,QMap的元素是由一对值组成的。第一个元素叫做Key,第二个元素叫做Value,Key和Value可以是两个不同的类型。

我们可以对比std::map去理解这个类。它也是一种STL风格迭代器的容器类。因为QMap元素组成的特殊性,所以经常用用到的操作有以下几种,最常用的是遍历和查找。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容