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

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「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的状态写入outout << 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.rhkb.cn/news/471709.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT<30> Qt中使鼠标变为转圈忙状态

前言&#xff1a;当我们在写软件时&#xff0c;在等待阻塞耗时操作时可以将鼠标变为忙状态&#xff0c;并在一段时间后恢复状态&#xff0c;可以用到GxtWaitCursor&#xff1a;Qt下基于RAII的鼠标等待光标类。 一、效果演示 二、详细代码 在项目中添加C文件&#xff0c;命名为…

Vue的基础使用

一、为什么要学习Vue 1.前端必备技能 2.岗位多&#xff0c;绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能&#xff08;Vue2Vue3&#xff09; 二、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 构建用户界面 的 渐进式 框架…

数据结构Python版

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

FBX福币交易所恒指收跌1.96% 半导体股继续回调

查查配分析11月14日电 周四,港股三大指数集体下跌。截至收盘,恒生指数跌1.96%,恒生科技指数跌3.08%,恒生中国企业指数跌2.21%。大市成交额1733亿港元。 FBX福币凭借用户友好的界面和对透明度的承诺,迅速在加密货币市场中崭露头角,成为广大用户信赖的平台。 来源:Wind 盘面上,科…

【学习日记】notebook添加JAVA支持

作者是个大学生 这个专栏主要收集课时常用的软件 以及女朋友上课用的软件的教程 新开了gitcode 用于上传安装包 环境说明 windows11 java23.0.1 ijava1.1.2 Anaconda-2024.02 需提前配置好java环境 本篇仅对添加支持进行说明 ijava的GitCode链接NotebookAddsSupportForJava:no…

RabbitMQ 篇-深入了解延迟消息、MQ 可靠性(生产者可靠性、MQ 可靠性、消费者可靠性)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 RabbitMQ 的可靠性 2.0 发送者的可靠性 2.1 生产者重试机制 2.2 生产者确认机制 2.2.1 开启生产者确认机制 2.2.2 定义 ReturnCallback 机制 2.2.3 定义 ConfirmC…

【数据结构】AVL树

引言&#xff1a;在实际情况中&#xff0c;数据不仅仅要存储起来&#xff0c;还要进行对数据进行搜索&#xff0c;为了方便进行高效搜索(在此之前的数据结构的搜索基本都是暴力搜索)二叉搜索树应运而生。但是在极端情况下(我们按照有序的方式进行插入)&#xff0c;二叉搜索树就…

CSS的综合应用例子(网页制作)

这是html的一些最基本内容的代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <t…

MySQL查询某个数据库中特定表的空间占用大小

如果您也想要查询某个数据库中特定表的空间占用大小&#xff0c;包括数据和索引的大小&#xff0c;那么您可以使用以下SQL查询。这个查询将显示特定表在数据库中的数据大小、索引大小以及总大小。 SELECT table_name AS Table,ROUND(((data_length index_length) / 1024 / 10…

Towards Reasoning in Large Language Models: A Survey

文章目录 题目摘要引言什么是推理?走向大型语言模型中的推理测量大型语言模型中的推理发现与启示反思、讨论和未来方向 为什么要推理?结论题目 大型语言模型中的推理:一项调查 论文地址:https://arxiv.org/abs/2212.10403 项目地址: https://github.com/jeffhj/LM-reason…

进入未来城:第五周游戏指南

欢迎来到 Alpha 第 4 季第五周&#xff01; 走进霓虹闪烁的未来城街道&#xff0c;这是一座科技至上的赛博朋克大都市。鳞次栉比的摩天大楼熠熠生辉&#xff0c;拥挤的街道下则是阴森恐怖的地下世界。在这里&#xff0c;像激光鹰队长这样的超级战士正在巡逻&#xff0c;而 Ago…

斯坦福泡茶机器人DexCap源码解析:涵盖收集数据、处理数据、模型训练三大阶段

前言 因为我司「七月在线」关于dexcap的复现/优化接近尾声了(每月逐步提高复现的效果)&#xff0c;故准备把dexcap的源码也分析下&#xff0c;11月​下旬则分析下iDP3的源码——为队伍「iDP3人形的复现/优化」助力 最开始&#xff0c;dexcap的源码分析属于此文《DexCap——斯…

Python中的HTML

文章目录 一. HTML1. html的定义2. html的作用3. 基本结构4. 常用的html标签5. 列表标签① 无序列表② 有序列表 6. 表格标签7. 表单标签8. 表单提交① 表单属性设置② 表单元素属性设置 一. HTML 1. html的定义 HTML 的全称为&#xff1a;HyperText Mark-up Language, 指的是…

PdServer:调用MidjourneyAPI完成静夜思图文生成

欢迎沟通讨论&#xff0c;WX: cdszsz。公号&#xff1a;AIGC中文站。 今天我们将使用PdServer&#xff0c;通过Qwen大模型完成古诗的解析与prompt的生成&#xff0c;然后调用MidjourneyAPI完成图片的生成。有了文案和图片&#xff0c;我们就可以将其生成为一个古诗讲读视频。从…

论文 | The Capacity for Moral Self-Correction in LargeLanguage Models

概述 论文探讨了大规模语言模型是否具备“道德自我校正”的能力&#xff0c;即在收到相应指令时避免产生有害或偏见输出的能力。研究发现&#xff0c;当模型参数达到一定规模&#xff08;至少22B参数&#xff09;并经过人类反馈强化学习&#xff08;RLHF&#xff09;训练后&…

认证鉴权框架SpringSecurity-1--概念和原理篇

1、基本概念 Spring Security 是一个强大且高度可定制的框架&#xff0c;用于构建安全的 Java 应用程序。它是 Spring 生态系统的一部分&#xff0c;提供了全面的安全解决方案&#xff0c;包括认证、授权、CSRF防护、会话管理等功能。 2、认证、授权和鉴权 &#xff08;1&am…

删库跑路,启动!

起因&#xff1a;这是一个悲伤的故事&#xff0c;在抓logcat时 device待机自动回根目录了&#xff0c;而题主对当前路径的印象还停留在文件夹下&#xff0c;不小心在根目录执行了rm -rf * … 所以&#xff0c;这是个悲伤的故事&#xff0c;东西全没了…device也黑屏了&#xff…

unity单例模式的不同声明(待完善

总结&#xff1a; 这段代码实现了一个泛型单例模式&#xff08;Singleton Pattern&#xff09;&#xff0c;用于确保某个类&#xff08;由泛型参数 T 指定&#xff09;在整个应用程序中只有一个实例&#xff0c;并且在第一次访问时才创建该实例。该模式保证了该实例的全局唯一…

低代码牵手 AI 接口:开启智能化开发新征程

一、低代码与 AI 接口的结合趋势 低代码开发平台近年来在软件开发领域迅速崛起。随着企业数字化转型的需求不断增长&#xff0c;低代码开发平台以其快速构建应用程序的优势&#xff0c;满足了企业对高效开发的需求。例如&#xff0c;启效云低代码平台通过范式化和高颗粒度的可配…

3. Sharding-Jdbc核⼼流 程+多种分⽚策略

1. Sharding-Jdbc 分库分表执⾏核⼼流程 Sharding-JDBC执行流程 1. SQL解析 -> SQL优化 -> SQL路由 -> SQL改写 -> SQL执⾏-> 结果归并 ->返回结果简写为&#xff1a;解析->路由->改写->执⾏->结果归并1.1 SQL解析 1. SQL解析过程分为词法解析…