「QT」文件类 之 QDataStream 数据流类

news2024/11/16 5:38:38

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「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>

四、类的注意事项

  1. 字节序:QDataStream默认使用小端字节序(即最低有效字节存储在最低内存地址)。如果需要与使用大端字节序的系统进行交互,可以使用setByteOrder()函数进行调整。
  2. 浮点数精度:在序列化浮点数时,QDataStream会保留足够的精度以恢复原始值,但请注意,由于浮点数的表示方式,非常小的差异可能是不可避免的。
  3. 版本兼容性:当使用QDataStream进行持久化存储时,应考虑数据格式的版本兼容性。如果数据格式发生变化,可能需要提供向后兼容的读取逻辑。
  4. 自定义类型支持:对于自定义的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重载了<<(插入运算符)和>>(提取运算符),以便能够方便地将数据写入流和从流中读取数据。这些运算符对于基本数据类型(如intfloatQString等)以及支持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对象。最后,我们打印了反序列化后的对象状态以验证结果。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2241290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL45讲 第二十三讲 是怎么保证数据不丢的?

文章目录 MySQL45讲 第二十三讲 是怎么保证数据不丢的&#xff1f;一、binlog 写入机制&#xff08;一&#xff09;事务执行与 binlog cache&#xff08;二&#xff09;事务提交与 binlog 文件写入 二、redo log 写入机制&#xff08;一&#xff09;事务执行与 redo log buffer…

pgaudit插件-pgslq

使用pgaudit插件 一.介绍 postgresql可以通过log_statementall 提供日志审计&#xff0c;但是无法详细的提供日志信息&#xff0c;使用ogaudit能够提供详细的会话和对象审计日志&#xff0c;是PG的一个扩展插件 注意&#xff1a;pgAudit可能会生成大量日志。请谨慎确定要在您…

系统掌握大语言模型提示词 - 从理论到实践

以下是我目前的一些主要个人标签&#xff1a; 6 年多头部大厂软件开发经验&#xff1b;1 年多 AI 业务应用经验&#xff0c;拥有丰富的业务提示词调优经验和模型微调经验。信仰 AGI&#xff0c;已经将 AI 通过自定义 Chatbot /搭建 Agent 融合到我的工作流中。头部大厂技术大学…

Vue 项目打包后环境变量丢失问题(清除缓存),区分.env和.env.*文件

Vue 项目打包后环境变量丢失问题&#xff08;清除缓存&#xff09;&#xff0c;区分.env和.env.*文件 问题背景 今天在导报项目的时候遇到一个问题问题&#xff1a;在开发环境中一切正常&#xff0c;但在打包后的生产环境中&#xff0c;某些环境变量&#xff08;如 VUE_APP_B…

群控系统服务端开发模式-应用开发-前端菜单功能开发

今天优先开发菜单及角色&#xff0c;明天将开发岗位配置、级别配置等功能。具体看下图 而前端的路由不需要手动添加&#xff0c;是依据数据库里面存储的路径。 一、添加视图 在根目录下src文件夹下views文件夹下permission文件夹下menu文件夹下&#xff0c;新建index.vue&…

数据结构Python版

2.3.3 双链表 双链表和链表一样&#xff0c;只不过每个节点有两个链接——一个指向后一个节点&#xff0c;一个指向前一个节点。此外&#xff0c;除了第一个节点&#xff0c;双链表还需要记录最后一个节点。 每个结点为DLinkNode类对象&#xff0c;包括存储元素的列表data、…

【HarmonyOS学习日志(8)】UIAbility,HAP,AbilityStage组件及其生命周期

基本概念 UIAbility组件是一种包含UI的应用组件&#xff0c;主要用于和用户交互。 在项目创建时&#xff0c;系统默认生成的EntryAbility类继承了UIAbility类。 ExtensionAbility组件&#xff1a;是基于特定场景&#xff08;例如服务卡片、输入法等&#xff09;提供的应用组件…

【Linux】多线程(中)

目录 一、线程互斥 1.1 互斥概念 1.2 互斥量mutex 1.3 互斥量相关API &#xff08;1&#xff09;初始化互斥量 &#xff08;2&#xff09;销毁互斥量 &#xff08;3&#xff09;互斥量加锁和解锁 1.4 互斥量原理 1.5 重入和线程安全 二、死锁 2.1 概念 2.2 造成死锁…

【数字图像处理+MATLAB】基于 Sobel 算子计算图像梯度并进行边缘增强:使用 imgradientxy 函数

引言 在图像处理中&#xff0c;边缘通常是图像中像素强度变化最大的地方&#xff0c;这种变化可以通过计算图像的梯度来量化。梯度是一个向量&#xff0c;它的方向指向像素强度增加最快的方向&#xff0c;它的大小&#xff08;或者说幅度&#xff09;表示像素强度增加的速度。…

Nuxt.js 应用中的 schema:beforeWrite 事件钩子详解

title: Nuxt.js 应用中的 schema:beforeWrite 事件钩子详解 date: 2024/11/14 updated: 2024/11/14 author: cmdragon excerpt: schema:beforeWrite 钩子是 Vite 提供的一个功能强大的生命周期钩子,允许开发者在 JSON Schema 被写入之前执行自定义操作。利用这个钩子,您可以…

k8s服务内容滚动升级以及常用命令介绍

查看K8S集群所有的节点信息 kubectl get nodes 删除K8S集群中某个特定节点 kubectl delete nodes/10.0.0.123 获取K8S集群命名空间 kubectl get namespace 获取K8S所有命名空间的那些部署 kubectl get deployment --all-namespaces 创建命名空间 web界面上看到的效果,但是…

MinIo在Ubantu和Java中的整合

1.MinIo在Ubantu中的部署 首先准备好一台已经安装好Ubantu系统的服务器 MinIO是一个开源的对象存储服务器&#xff0c;兼容Amazon S3&#xff0c;性能卓越&#xff0c;适合存储非结构化数据&#xff0c;例如照片、视频、日志文件、备份和容器镜像等。 1&#xff1a;更新系统…

设计模式-参考的雷丰阳老师直播课

一般开发中使用的模式为模版模式策略模式组合&#xff0c;模版用来定义骨架&#xff0c;策略用来实现细节。 模版模式 策略模式 与模版模式特别像&#xff0c;模版模式会定义好步骤定义好框架&#xff0c;策略模式定义小细节 入口类 使用模版模式策略模式开发支付 以上使用…

【LeetCode】【算法】53. 最大子数组和

LeetCode 53. 最大子数组和 题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。子数组是数组中的一个连续部分。 思路 思路&#xff1a;动态规划秒了 具体递推式如…

供应SW6301V单C口多协议升降压移动电源IC

1. 概述 SW6301V 是一款高集成度的单 C 口多协议升降压移动电源 SOC。集成双向升降压控制器&#xff0c;支持 2~6 节 电池串联&#xff0c;提供 100W 功 率 输 入 输 出 &#xff1b; 支 持 C 口 快 充 输入输出 &#xff1b; 支 持UFCS/PPS/PD/SVOOC/VOOC/SCP/FCP/QC/AFC/BC…

C++常用的新特性-->day06

时间间隔duration duration表示一段时间间隔&#xff0c;用来记录时间长度&#xff0c;可以表示几秒、几分钟、几个小时的时间间隔。duration的原型如下 // 定义于头文件 <chrono> template<class Rep,class Period std::ratio<1> > class duration;Rep&…

Cyberchef配合Wireshark提取并解析TCP/FTP流量数据包中的文件

前一篇文章中讲述了如何使用cyberchef提取HTTP/TLS数据包中的文件,详见《Cyberchef配合Wireshark提取并解析HTTP/TLS流量数据包中的文件》,链接这里,本文讲述下如何使用cyberchef提取FTP/TCP数据包中的文件。 FTP 是最为常见的文件传输协议,和HTTP协议不同的是FTP协议传输…

性能面向下一代PCIe Gen 5,G991B322HR、G99L12312HR 安费诺ExtremePort™ Swift连接器支持内部I/O应用

前言 为了在网络设备和服务器上提供更高速度和更小尺寸的解决方案&#xff0c;Amphenol开发了ExtremePort™ Swift连接器&#xff0c;适用于PCIe Gen5 NRZ 32GT/s、UPI 2.0 24GT/s、24Gb/s SAS信号。 G991B322HR G9912312HR G9912322HR G9914312HR G991B312HR G991C312HR G99…

IDEA调整警告级别【IntelliJ IDEA 2024.2.0.1】

文章目录 目前现状鼠标悬停&#xff0c;选择配置筛选 > 取消选择OK效果 目前现状 需要把提示改成只要显示error的5个 鼠标悬停&#xff0c;选择配置 筛选 > 取消选择 OK 效果

【二叉搜素树】——LeetCode二叉树问题集锦:6个实用题目和解题思路

文章目录 计算布尔二叉树的值求根节点到叶节点的数字之和二叉树剪枝验证二叉搜索树二叉搜索树中第K小的元素二叉树的所有路径 计算布尔二叉树的值 解题思路&#xff1a; 这是一个二叉树的布尔评估问题。树的每个节点包含一个值&#xff0c;其中叶子节点值为 0 或 1&#xff0…