Qt开发:QDataStream的常用方法

news/2025/2/13 6:41:32/

文章目录

    • 一、QDataStream的构造函数
    • 二、QDataStream的读写操作符
    • 三、QDataStream的状态检查
    • 四、QDataStream的版本控制
    • 五、QDataStream的序列化自定义类型

一、QDataStream的构造函数

在 Qt 中,QDataStream 类提供了对二进制数据的序列化和反序列化功能,方便地在文件或网络中读写各种数据类型。

  • QDataStream():默认构造函数。
  • QDataStream(QIODevice *device):使用指定的 QIODevice 对象初始化数据流。
  • QDataStream(QByteArray *byteArray, QIODevice::OpenMode mode):使用指定的字节数组和打开模式初始化数据流。

1.创建一个空的 QDataStream 对象
使用默认构造函数创建的 QDataStream 对象在初始化时未绑定任何设备或数据缓冲区。要使其可用于读写操作,需要在稍后阶段通过 setDevice() 方法将其与一个 QIODevice 对象(如 QFile、QBuffer 等)关联。

示例代码:

#include <QFile>
#include <QDataStream>
#include <QDebug>int main() {// 创建一个 QDataStream 对象,未绑定任何设备QDataStream stream;// 创建一个 QFile 对象并打开QFile file("data.dat");if (!file.open(QIODevice::WriteOnly)) {qWarning() << "无法打开文件进行写入";return 1;}// 将 QDataStream 与 QFile 关联stream.setDevice(&file);// 设置数据流版本(可选,但建议设置以确保兼容性)stream.setVersion(QDataStream::Qt_6_5);// 写入数据qint32 number = 42;QString text = "Hello, QDataStream!";stream << number << text;// 关闭文件file.close();// 读取数据if (!file.open(QIODevice::ReadOnly)) {qWarning() << "无法打开文件进行读取";return 1;}// 将 QDataStream 与 QFile 重新关联stream.setDevice(&file);qint32 readNumber;QString readText;stream >> readNumber >> readText;// 输出读取的数据qDebug() << "读取的数字:" << readNumber;qDebug() << "读取的文本:" << readText;// 关闭文件file.close();return 0;
}

2.绑定到一个 QIODevice(如 QFile、QTcpSocket 等)
通过此构造函数,您可以将 QDataStream 与任何继承自 QIODevice 的设备(如 QFile、QBuffer、QTcpSocket 等)关联,以实现对这些设备的二进制数据读写操作。
以下示例演示了如何使用 QDataStream 将整数和字符串写入文件,然后再读取这些数据:

#include <QFile>
#include <QDataStream>
#include <QDebug>int main() {// 创建一个 QFile 对象并指定文件名QFile file("data.dat");// 以写入模式打开文件if (!file.open(QIODevice::WriteOnly)) {qWarning() << "无法打开文件进行写入";return 1;}// 将 QDataStream 与 QFile 关联QDataStream out(&file);// 设置数据流版本(可选,但建议设置以确保兼容性)out.setVersion(QDataStream::Qt_6_5);// 写入数据到文件qint32 number = 42;QString text = "Hello, QDataStream!";out << number << text;// 关闭文件file.close();// 以读取模式重新打开文件if (!file.open(QIODevice::ReadOnly)) {qWarning() << "无法打开文件进行读取";return 1;}// 将 QDataStream 与 QFile 重新关联QDataStream in(&file);in.setVersion(QDataStream::Qt_6_5);// 读取数据qint32 readNumber;QString readText;in >> readNumber >> readText;// 输出读取的数据qDebug() << "读取的数字:" << readNumber;qDebug() << "读取的文本:" << readText;// 关闭文件file.close();return 0;
}

3.绑定到一个 QByteArray,用于内存中的序列化
在 Qt 中,QDataStream 提供了一个构造函数,允许直接对 QByteArray 进行读写操作。

QDataStream(QByteArray *byteArray, QIODevice::OpenMode mode);

参数说明:

  • byteArray:指向目标 QByteArray 对象的指针。
  • mode:指定数据流的打开模式,通常为 QIODevice::ReadOnly、QIODevice::WriteOnly 或 QIODevice::ReadWrite。

注意:由于 QByteArray 不是 QIODevice 的子类,QDataStream 内部会创建一个 QBuffer 来包装该字节数组,以实现对其的读写操作。

示例代码:

#include <QByteArray>
#include <QDataStream>
#include <QDebug>int main() {// 创建一个空的 QByteArrayQByteArray byteArray;// 将 QDataStream 绑定到 QByteArray,设置为读写模式QDataStream out(&byteArray, QIODevice::WriteOnly);// 设置数据流版本(可选,但建议设置以确保兼容性)out.setVersion(QDataStream::Qt_6_5);// 写入数据到 QByteArrayqint32 number = 42;QString text = "Hello, QDataStream!";out << number << text;// 输出写入后的 QByteArray 大小qDebug() << "Byte array size after writing:" << byteArray.size();// 读取数据QDataStream in(&byteArray, QIODevice::ReadOnly);in.setVersion(QDataStream::Qt_6_5);qint32 readNumber;QString readText;in >> readNumber >> readText;// 输出读取的数据qDebug() << "Read number:" << readNumber;qDebug() << "Read text:" << readText;return 0;
}

二、QDataStream的读写操作符

QDataStream 提供了重载的插入(<<)和提取(>>)操作符,用于写入和读取各种数据类型。

写入数据:

#include <QFile>
#include <QDataStream>QFile file("data.dat");
if (file.open(QIODevice::WriteOnly)) {QDataStream out(&file);qint32 number = 42;QString text = "Hello, QDataStream!";out << number << text;file.close();
}

读取数据:

#include <QFile>
#include <QDataStream>QFile file("data.dat");
if (file.open(QIODevice::ReadOnly)) {QDataStream in(&file);qint32 number;QString text;in >> number >> text;file.close();// 使用读取的数据
}

三、QDataStream的状态检查

  • QDataStream::Status status() const
    返回流的状态,可能的值包括:
    • QDataStream::Ok:正常。
    • QDataStream::ReadPastEnd:读取超出数据范围。
    • QDataStream::ReadCorruptData:数据损坏。
if (stream.status() != QDataStream::Ok) {qWarning() << "Stream error!";
}
  • void resetStatus()
    重置流的状态为 Ok。
stream.resetStatus();

四、QDataStream的版本控制

  • void setVersion(int)
    设置流的版本号,用于兼容不同版本的序列化格式。
stream.setVersion(QDataStream::Qt_6_0);
  • int version() const
    获取当前流的版本号。
int version = stream.version();

五、QDataStream的序列化自定义类型

#include <QDataStream>
#include <QString>class Person {
public:QString name;int age;friend QDataStream& operator<<(QDataStream& stream, const Person& person) {stream << person.name << person.age;return stream;}friend QDataStream& operator>>(QDataStream& stream, Person& person) {stream >> person.name >> person.age;return stream;}
};int main() {Person person;person.name = "Alice";person.age = 30;QByteArray byteArray;QDataStream stream(&byteArray, QIODevice::WriteOnly);stream << person;QDataStream readStream(&byteArray, QIODevice::ReadOnly);Person readPerson;readStream >> readPerson;qDebug() << "Name:" << readPerson.name << "Age:" << readPerson.age;return 0;
}

http://www.ppmy.cn/news/1571634.html

相关文章

js实现异步的方法

所有异步任务都是在同步任务执行结束之后&#xff0c;从任务队列中依次取出执行。 回调函数是异步操作最基本的方法&#xff0c;比如AJAX回调&#xff0c;回调函数的优点是简单、容易理解和实现&#xff0c;缺点是不利于代码的阅读和维护&#xff0c;各个部分之间高度耦合&…

深入浅出学算法030-兔子繁殖

题目描述 有一种兔子&#xff0c;出生后一个月就可以长大&#xff0c;然后再过一个月一对长大的兔子就可以生育一对小兔子且以后每个月都能生育一对。现在&#xff0c;我们有一对刚出生的这种兔子&#xff0c;那么&#xff0c;n个月过后&#xff0c;我们会有多少对兔子呢&…

在 ARM64 架构系统离线安装 Oracle Java 8 全流程指南

在 ARM64 架构系统离线安装 Oracle Java 8 全流程指南 文章目录 在 ARM64 架构系统离线安装 Oracle Java 8 全流程指南一、引言二、下载前的准备2.1 确认系统架构2.2 注册 Oracle 账号 三、从 Oracle 官方下载 Java 8 for ARM643.1 访问 Oracle Java 存档页面3.2 选择合适的版本…

【学术投稿-2025年计算机视觉研究进展与应用国际学术会议 (ACVRA 2025)】CSS样式解析:行内、内部与外部样式的区别与优先级分析

简介 2025年计算机视觉研究进展与应用&#xff08;ACVRA 2025&#xff09;将于2025年2月28-3月2日在中国广州召开&#xff0c;会议将汇聚世界各地的顶尖学者、研究人员和行业专家&#xff0c;聚焦计算机视觉领域的最新研究动态与应用成就。本次会议将探讨前沿技术&#xff0c;…

实验7 路由器之间IPsec VPN配置

实验7 路由器之间IPsec VPN配置 1.实验目的 通过在两台路由器之间配置IPsec VPN连接&#xff0c;掌握IPsec VPN配置方法&#xff0c;加深对IPsec协议的理解。 2.实验内容 &#xff08;1&#xff09;按照实验拓扑搭建实验环境。 &#xff08;2&#xff09;在路由器R1和R4配置IP…

GPT-4o微调SFT及强化学习DPO数据集构建

假设&#xff0c;已经标注的训练数据集df包含了提示词、输入和输出三列。 构建微调SFT的数据集代码如下&#xff1a; data [] for x in df.values:prompt x[1]user_content x[2]assistant_content x[3]data.append({"messages": [{"role": "sys…

XML DOM

XML DOM XML DOM(Document Object Model)是一种用于访问和操作XML文档的标准方式。它提供了一种树形结构来表示XML文档,使得开发者能够方便地对XML数据进行读取、修改和操作。本文将详细介绍XML DOM的基本概念、结构、操作方法以及应用场景。 一、XML DOM的基本概念 XML …

问题:通过策略模式+工厂模式+模板方法模式实现ifelse优化

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 示例&#xff1a;商城系统有会员系统&#xff0c;不同会员有不同优惠程度&#xff0c;普通会员不优惠&#xff1b;黄金会员打8折&#xff1b;白金会员优惠50元&#xff0c;再打7折&#xff1b; 问题描…