前言
上一节已经成功创建了一个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,只有“ ”的字符串也不是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元素组成的特殊性,所以经常用用到的操作有以下几种,最常用的是遍历和查找。
作者:黑兔子
链接:https://juejin.cn/post/7170613824876183565
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
发表评论