[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型字符。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)