qt 怎么在qbytearray添加数据的方法

qt 怎么在qbytearray添加数据的方法,第1张

面给出简单例子,用于入门。

[cpp] view plain copy

QByteArray qByteArray("") //定义一个空QByteArray对象,记住括号内要有“”,否则所无效对象。

qByteArray.append("daniel")//后面添加字符串

qDebug()<<"qByteArray = "<<qByteArray.data()<<"\n"//返回数据指针

qDebug()<<"The size of qByteArray is "<<qByteArray.size()<<"\n"//返回大小,不保护末尾的‘\n’

qDebug()<<"The number of occurrences of 'a' is "<<qByteArray.count('a')<<"\n"//查询重复次数

qByteArray.fill('a')//更改填充值

qDebug()<<"qByteArray = "<<qByteArray.data()<<"\n"

记得包含头文件:

[cpp] view plain copy

1. 利用memcpy拷贝内存数据

//自定义person结构体

Cpp代码

typedef struct

{

int age

char name[20]

}Person

//向QByteArray写入多个结构体

void writeStruct()

{

QByteArray ba

ba.resize(2*sizeof(Person))//设置容量

//序列化

for(int i=0i<2i++)

{

Person p1

p1.age=10+i

strcpy(p1.name,"javaeye")

memcpy(ba.data()+i*sizeof(Person),&p1,sizeof(Person))//指针移动,写入多个数据

}

//还原数据

Person *person=(Person*)ba.data()

qDebug()<<person->age<<"---"<<person->name

person++

qDebug()<<person->age<<"---"<<person->name

}

memcpy只能处理字段为基本类型的结构体, 当使用QString name, 我用person->name去访问其值, 程序崩溃由此可见,内存数据无法还原构建成QString类. 如果要写入自定的QT类, 只能借助QBuffer了, 通过二进制流写入

2. QBuffer写入QT自定义结构体

Cpp代码

//QBuffer序列化自定义对象

typedef struct

{

int age

QString name

}QPerson

/**

*@brief 重载自定义对象的输入

*/

inline QDataStream &operator<<(QDataStream &out,const QPerson &per)

{

out<<per.age<<per.name

return out

}

/**

*@brief 重载自定义对象的输出

*/

inline QDataStream &operator>>(QDataStream &in,QPerson &per)

{

int age

QString name

in>>age>>name

per.age=age

per.name=name

return in

}

/**

* @brief QBuffer能处理QT自定义类型

*/

void testQBuffer()

{

QByteArray ba

ba.resize(2*sizeof(QPerson))

QBuffer buffer(&ba)

buffer.open(QIODevice::WriteOnly)

//输入

QDataStream out(&buffer)

for(int i=0i<2i++)

{

QPerson per

per.age=20+i

per.name=QString("sun_%1").arg(i+1)

out<<per

}

buffer.close()

//输出

QBuffer buf(&ba)

buf.open(QIODevice::ReadOnly)

QDataStream in(&buf)

for(int i=0i<2i++)

{

QPerson per

in>>per

qDebug()<<per.age<<"---"<<per.name

}

buf.close()

}

QChar :表示一个Unicode编码的字符;

QByteArray :相当于是QChar的一个vector<>;

QStringRef :是对QString一部分的一个引用,作了一些优化;

QStringList :是QList的派生类,是字符串的列表类,非常有用;

QRegExp :对于正则表达式提供了丰富的 *** 作,详细用法;

QTextCodec :提供QString与不同编码的字符串之间的转换 

隐式共享又称回写复制。

1、当两个对象共享同一份数据(通过浅拷贝实现数据块的共享)时,如果数据不改变,则不进行数据的复制(浅拷贝,引用)。

2、而当某个对象需要改变数据时,则进行深拷贝(堆中开辟空间)。

Qt中支持隐式共享的类,还包括:

1、所有的容器类。

2、QString、QByteArray、QBrush、QPen、QPalette、QBitmap、QImage、QPixmap、QCursor、QDir、QFont和QVariant等。

详细参见 QString类的详细用法

QString类存储Unicode 字符串(UTF-16编码),QString字符串中能嵌入'\0'字符,length()函数返回整个字符串的大小,包括嵌入的'\0'字符。

QString转Qchar时,需先转换成QByteArray。

常用字符串函数如下:

        返回【从pos起长度为len】的字符串。

        返回【从pos起到字符串结尾】的字符串。

        返回【最前面 长度为len】的字符串。

        返回【最后面 长度为len】的字符串。

第一个参数为【待检字符串 / 字符】;第二个参数为【起始位置】,默认从0字节开始检索。

检索成功返回字节起始位置值,检索失败返回 -1。

检查字符串是否以【字符串 / 字符】开始,成功则返回true,失败则返回false。

检查字符串是否以【字符串 / 字符】结尾,成功则返回true,失败则返回false。

QByteArray类存储char型字符。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11540043.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存