✨博客主页 | ||
---|---|---|
何曾参静谧的博客 | ||
📌文章专栏 | ||
「QT」QT5程序设计 | ||
📚全部专栏 | ||
「Win」Windows程序设计 | 「IDE」集成开发环境 | 「UG/NX」BlockUI集合 |
「C/C++」C/C++程序设计 | 「DSA」数据结构与算法 | 「UG/NX」NX二次开发 |
「QT」QT5程序设计 | 「File」数据文件格式 | 「UG/NX」NX定制开发 |
「Py」Python程序设计 | 「Math」探秘数学世界 | 「PK」Parasolid函数说明 |
目录
- QDataStream类在Qt 5.15中的详细介绍
- 一、引言
- 二、使用范围
- 三、类的头文件
- 四、类的注意事项
- 五、类的继承
- 六、类的构造介绍
- 七、公有函数介绍
- 八、Static函数介绍
- 九、运算符重载
- 十、详细代码举例
QDataStream类在Qt 5.15中的详细介绍
一、引言
QDataStream是Qt框架中的一个类,它提供了基于Qt数据类型的二进制流接口。通过QDataStream,可以方便地将Qt的基本数据类型(如整型、浮点型、字符串等)以及自定义的Qt对象序列化(即将对象的状态转换为字节流)和反序列化(即从字节流恢复对象的状态)。QDataStream支持的平台无关性使得它成为跨平台数据交换和存储的理想选择。
二、使用范围
QDataStream广泛应用于以下场景:
- 文件存储:将对象的状态保存到文件中,以便稍后恢复或在不同程序之间共享。
- 网络通信:通过网络发送和接收Qt对象,实现客户端和服务器之间的数据交换。
- 内存中的数据交换:在程序的不同部分之间传递Qt对象,而无需依赖于特定的对象序列化机制。
三、类的头文件
QDataStream类的头文件是<QDataStream>
。在使用QDataStream时,需要包含这个头文件。
#include <QDataStream>
四、类的注意事项
- 字节序:QDataStream默认使用小端字节序(即最低有效字节存储在最低内存地址)。如果需要与使用大端字节序的系统进行交互,可以使用
setByteOrder()
函数进行调整。 - 浮点数精度:在序列化浮点数时,QDataStream会保留足够的精度以恢复原始值,但请注意,由于浮点数的表示方式,非常小的差异可能是不可避免的。
- 版本兼容性:当使用QDataStream进行持久化存储时,应考虑数据格式的版本兼容性。如果数据格式发生变化,可能需要提供向后兼容的读取逻辑。
- 自定义类型支持:对于自定义的Qt对象,需要实现
<<
和>>
运算符的重载,以便QDataStream能够正确地序列化和反序列化它们。
五、类的继承
QDataStream是一个独立的类,不继承自其他Qt类。它提供了用于读写二进制数据的接口,并与Qt的数据类型系统紧密结合。
六、类的构造介绍
QDataStream有两个主要的构造函数,分别用于基于设备(如文件、缓冲区等)和基于字节数组的流。
- QDataStream(QIODevice *device):创建一个与指定设备关联的QDataStream对象。设备可以是文件、内存缓冲区、网络连接等。
- QDataStream(QByteArray *array, QIODevice::OpenMode mode = QIODevice::ReadWrite):创建一个与指定字节数组关联的QDataStream对象。这种模式通常用于在内存中处理数据。
七、公有函数介绍
QDataStream提供了一系列公有函数来读写数据。以下是一些常用的公有函数:
- *QIODevice device() const:返回与流关联的设备对象(如果有的话)。
- void setDevice(QIODevice *device):设置与流关联的新设备对象。
- void setByteOrder(QDataStream::ByteOrder byteOrder):设置流的字节序。
- QDataStream::ByteOrder byteOrder() const:返回流的当前字节序。
- void setFloatingPointPrecision(QDataStream::FloatingPointPrecision precision):设置浮点数的精度。
- QDataStream::FloatingPointPrecision floatingPointPrecision() const:返回浮点数的当前精度。
此外,QDataStream还重载了<<
和>>
运算符,用于读写基本数据类型和自定义类型。
八、Static函数介绍
QDataStream没有提供静态函数。它的所有功能都通过对象实例的方法来实现。
九、运算符重载
QDataStream重载了<<
(插入运算符)和>>
(提取运算符),以便能够方便地将数据写入流和从流中读取数据。这些运算符对于基本数据类型(如int
、float
、QString
等)以及支持QDataStream的自定义类型都是可用的。
对于自定义类型,需要实现这些运算符的重载,以便QDataStream能够正确地处理它们。例如:
QDataStream &operator<<(QDataStream &out, const MyCustomType &obj) {
// 将MyCustomType的状态写入out
out << obj.field1 << obj.field2 << ...;
return out;
}
QDataStream &operator>>(QDataStream &in, MyCustomType &obj) {
// 从in中读取MyCustomType的状态
in >> obj.field1 >> obj.field2 >> ...;
return in;
}
十、详细代码举例
以下是一个使用QDataStream的示例代码,用于演示如何将一个自定义的Qt对象序列化到文件,并从文件中反序列化回来。
#include <QCoreApplication>
#include <QDataStream>
#include <QFile>
#include <QIODevice>
#include <QString>
#include <QDebug>
// 自定义类型
class MyData {
public:
int id;
QString name;
float value;
// 实现QDataStream的<<运算符重载
friend QDataStream &operator<<(QDataStream &out, const MyData &data) {
out << data.id << data.name << data.value;
return out;
}
// 实现QDataStream的>>运算符重载
friend QDataStream &operator>>(QDataStream &in, MyData &data) {
in >> data.id >> data.name >> data.value;
return in;
}
};
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
// 创建并填充一个MyData对象
MyData data;
data.id = 123;
data.name = "Example";
data.value = 45.67f;
// 将对象序列化到文件
QFile file("data.dat");
if (file.open(QIODevice::WriteOnly)) {
QDataStream out(&file);
out << data;
file.close();
} else {
qWarning() << "Failed to open file for writing";
}
// 从文件中反序列化对象
MyData newData;
if (file.open(QIODevice::ReadOnly)) {
QDataStream in(&file);
in >> newData;
file.close();
// 打印反序列化后的对象状态
qDebug() << "ID:" << newData.id;
qDebug() << "Name:" << newData.name;
qDebug() << "Value:" << newData.value;
} else {
qWarning() << "Failed to open file for reading";
}
return app.exec();
}
在这个示例中,我们首先定义了一个自定义类型MyData
,并实现了QDataStream的<<
和>>
运算符重载,以便能够序列化和反序列化该类型。然后,我们创建了一个MyData
对象,并将其序列化到一个名为data.dat
的文件中。接着,我们从该文件中读取数据,并将其反序列化回一个MyData
对象。最后,我们打印了反序列化后的对象状态以验证结果。