QT编程基础
基本数据类型
在中
类型名称 | 说明 | 备注 |
---|---|---|
qint8 | signed char | 有符号8位数据类型 |
qint16 | signed short | 有符号16位数据类型 |
qint32 | signed int | 有符号32位数据类型 |
qint64 | long long int | 有符号64位数据类型 |
quint8 | unsigned char | 无符号8位数据类型 |
quint16 | unsigned short | 无符号16位数据类型 |
quint32 | unsigned int | 无符号32位数据类型 |
quint64 | unsigned long long int | 无符号64位数据类型 |
qptrdiff | ptrdiff_t | 指针之间的差值 |
qreal | double | 64位浮点数 |
qulonglong | unsigned long long int | 无符号64位数据类型 |
quintptr | uintptr_t | 无符号整型,用于指针 |
uchar | unsigned char | 无符号字符类型 |
uint | unsigned int | 无符号整型 |
ulong | unsigned long | 无符号长整型 |
ushort | unsigned short | 无符号短整型 |
字节数组类QByteArray
存储原始字节的,比char* 用着更方便,常在串口中使用。
初始化
- 输入const char*传给构造参数
QByteArray b("Hello"); 创建大小为5的字节数组对象,索引为0到4,实际大小还是6
最后'/0'结尾,有时候作为字符串结尾使用。、
QByteArray b("hello");
if(b[5]=='\0'){
printf("b[5] is \0");
}
- 使用resize()设置数组大小
QByteArray ba;
ba.resize(6);
ba[0] = 0x3c;
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;
QByteArray类使用从0开始的索引值,就像C++数组一样。在调用resize()后,新分配的字节具有未定义的值。要将所有字节设置为特定值,可以调用fill()函数,该函数的原型声明如下:
QByteArray &QByteArray::fill(char ch, int size = -1)
访问数组
- [] 可读可写
- at[] 可读可写
- data[] 仅可读
- constData[] 仅可读
如果只是进行读操作,则通过at()和constData[]方式的访问速度最快,因为避免了复制处理。
at()可以比operator 更快,就是因为前者不会发生深层复制。
截取子数组
- left
函数left()返回从索引0位置开始、长度为len的子字节数组,该函数的原型声明如下:
QByteArray left(int len)
其中,参数len表示从数组左边开始要截取的字节数组的长度,如果len大于原来整个字节数组的长度,则返回整个字节数组。下列代码演示了函数left()函数的使用:
QByteArray x("Pineapple");
QByteArray y = x.left(4);
// y == "Pine"
- right
函数right()用来获取从字节数组最后一个字节数据开始,向前面截取len个字节并返回截取的子字节数组。该函数的原型声明如下:
QByteArray right(int len)
其中,参数len表示从右边开始要截取的子字节数组的长度,如果len大于原来整个字节数组的长度,则返回整个字节数组。下列代码演示了函数right()函数的使用:
QByteArray x("Pineapple");
QByteArray y = x.right(5);
// y == "apple"
- mid
函数mid()返回从指定索引位置开始,向右边(即后面)长度为len的子字节数组。该函数的原型声明如下:
QByteArray mid(int pos, int len = -1)
其中,参数pos表示开始截取的索引,索引值从0开始;len表示要截取的子字节数组的长度,如果len为-1(默认值)或pos+len大于原字节数组的长度,则返回从pos开始一直到右边剩下的全部字节数组。
获取字节数组的大小
可以用成员函数size、length和count来获取字节数组的大小。除了名字不同,这3个函数是等同的,函数的原型声明如下:
int size();
int length();
int count();
数据转换与处理
- 16进制编码转化为字符类型 (“51” 转化为0x51),也就是字符16禁止转化为16进制数据。 两个字节转换为一个字节。字符16进制转化成数值16进制。
QByteArray类的公有静态函数QByteArray::fromHex可以把十六进制编码的数据转换为字符(char)类型的数据,并存储到QByteArray类对象中。该函数的原型声明如下:
QByteArray fromHex(const QByteArray &hexEncoded)
其中,参数hexEncoded是十六进制编码的字节数组。由于该函数并不检查参数的有效性,因此遇到非十六进制数据则直接略过,然后继续处理剩余的数据。
字符’5’和’1’为一组,转为十六进制数据0x51,0x51对应的十进制数据是81,ASCII码为81的字符是’Q’。
与fromHex()相逆的函数是toHex(),该函数将字节数组中十六进制的数值编码转化为字符。
数值转换为字符串数值类型字节数组(62转化成"63")
显示二进制和十六进制、显示科学记数和指定小数位的数值,QByteArray类的公有静态函数number可以完成这些功能。该函数可以将某个整数转为某种进制的字符数组,函数number的原型声明如下:
QByteArray number(int n, int base = 10)
其中,参数n是要转变的整数;base是要进行转换的进制,进制取值范围为2到36,即从二进制到三十六进制。该函数返回整数n对应的base进制的字符数组。
与此公有静态函数功能类似的成员函数是setNum(),该函数也是将某个整数转为某种进制的字符数组,函数的原型声明如下:
QByteArray & setNum(int n, int base = 10)
其中,参数n是要转变的整数;base是要进行转换的进制,进制取值范围为2到36,即从二进制到三十六进制。该函数返回整数n对应的base进制的字符数组。下列代码演示了setNum()函数的使用:
QByteArray ba;
int n = 63;
ba.setNum(n); // ba == "63"
ba.setNum(n, 16); // ba == "3f"
因为不是静态函数,所以要用对象来调用。
字母大小写转换
toUpper();
toLower();
isLower();
isUpper()
字符串数值转化为各类数值
to**
QByteArray与char*互转
成员函数data可以返回指向字节数组中存储数据的指针。该函数的原型声明如下:
char data();
该指针可用于访问和修改组成数组的元素。可以指定具体访问字节数组中的某一个,比如ba.data()[0]表示访问第0个。
如果要把char转为QString,可以直接作为参数传入QByteArray类的构造函数中:
char* pt;
QByteArray byte(str);
QByteArray与std::string互转
string是C++标准库中的字符串类型。QByteArray类提供的成员函数toStdString()可以将字节数组转为string。该函数的原型声明如下:
std::string toStdString();
与该函数相反的函数是静态成员函数fromStdString(),它将string数据转为字节数组,该函数的原型声明如下:
[static] QByteArray QByteArray::fromStdString(const std::string &str);
其中,参数str是要转换的string字符串。函数返回转换后的字节数组。注意,转换的是str的一份备份,转换过程并不会影响str本身的内容。
与字符串QString互转
QByteArray与自定义结构体之间的转化
判断是否为空
可以使用函数isEmpty()来判断字节数组是否为空,即size是否为0。函数isEmpty()的原型声明如下:
bool isEmpty();
如果字节数组的size为0,则返回true,否则返回false。
向前搜索和向后搜索
indexof
lastindexof()
插入数据
函数insert()可以在某个索引位置上插入字节数组,该函数的原型声明如下:
QByteArray & insert(int i, const QByteArray &ba);
prrpend() 开头插入
字符类Qchar(对unicode字符的封装)
QChar类是Qt中用于表示一个字符的类,实现在QtCore共享库中。QChar类的内部用两个字节的Unicode编码来表示一个字符。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!