Qt开发:QDataStream的常用方法

文章目录

    • 一、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.rhkb.cn/news/17418.html

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

相关文章

畅聊deepseek-r1,SiliconFlow 硅基流动注册+使用

文章目录 SiliconFlow 硅基流动注册使用注册创建API密钥使用网页端使用代码调用api调用支持的模型 SiliconFlow 硅基流动注册使用 注册 硅基流动官网 https://cloud.siliconflow.cn/i/XcgtUixn 注册流程 切换中文 ​ 邀请码&#xff1a; XcgtUixn 创建API密钥 账户管理 --&g…

Java 大数据与区块链的融合:数据可信共享与溯源(45)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

初阶c语言(循环语句习题,完结)

前言&#xff1a; c语言为b站鹏哥&#xff0c;嗯对应视频37集 昨天做的c语言&#xff0c;今天在来做一遍&#xff0c;发现做错了 今天改了平均值的计算&#xff0c; 就是说最大值加上最小值&#xff0c;如果说这个数值非常大的话&#xff0c;两个值加上会超过int类型的最大…

传感器篇(一)——深度相机

目录 一 概要 二 原理 三 对比 四 产品 五 结论 一 概要 深度相机是一种能够获取物体深度信息的设备&#xff0c;相较于普通相机只能记录物体的二维图像信息&#xff0c;深度相机可以感知物体与相机之间的距离&#xff0c;从而提供三维空间信息。在你正在阅读的报告中提到…

蓝桥杯之并查集

算法思想 并查集是一种树形的数据结构&#xff0c;主要用于解决一些元素分组问题。用于处理一些不相交集合的合并以及查询问题。并查集的思想是用一个数组表示了整片森林&#xff0c;树的根节点唯一标识了一个集合&#xff0c;我们只要找到了某个元素的树根&#xff0c;就能确…

Windows11+PyCharm利用MMSegmentation训练自己的数据集保姆级教程

系统版本&#xff1a;Windows 11 依赖环境&#xff1a;Anaconda3 运行软件&#xff1a;PyCharm 一.环境配置 通过Anaconda Prompt(anaconda)打开终端创建一个虚拟环境 conda create --name mmseg python3.93.激活虚拟环境 conda activate mmseg 4.安装pytorch和cuda tor…

#渗透测试#批量漏洞挖掘#Crocus系统—Download 文件读取

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

day09_实时类标签/指标

文章目录 day09_实时类标签/指标一、日志数据实时采集2、Flume简介2.3 项目日志数据采集Flume配置2.3.1 涉及的Flume组件和参数2.3.2 Nginx日志采集2.3.3 用户行为日志采集 二、Nginx日志数据统计1、日志格式说明2、数据ETL2.1 日志抽取2.1.1 正则表达式2.1.2 基于Spark实现Ngi…

SpringBoot实战:高效获取视频资源

文章目录 前言技术实现SpringBoot项目构建产品选取配置数据采集 号外号外 前言 在短视频行业高速发展的背景下&#xff0c;海量内容数据日益增长&#xff0c;每天都有新的视频、评论、点赞、分享等数据涌现。如何高效、精准地获取并处理这些庞大的数据&#xff0c;已成为各大平…

位图,晶圆MAP 边缘算法

例如这样的一张图: 如果想要求外边缘点&#xff0c;即红色区域,首先遍历所有点位&#xff0c;求出每行每列X轴和Y轴的最大值MAX和最小值MIN。然后再次遍历每个点&#xff0c;判断该点的X值&#xff0c;Y值是否是最大值或者最小值&#xff0c;如果是&#xff0c;那么它就是外边…

【认证授权FAQ】SSL/TLS证书过期导致的CLS认证失败

问题现象 问题分析 属于Agent操作系统的根认证机构过期问题&#xff0c;需要下载CA然后在系统安装。 DigiCert根证书和中间证书将在未来几年过期&#xff0c;一旦证书过期&#xff0c;基于证书颁发的SSL/TLS证书将不再信任&#xff0c;导致网站无法HTTPs访问。需要迁移到新的根…

【安全测试】0基础新手学Web安全测试笔记(一)

文章目录 一、关于账号密码的漏洞二、关于验证码的漏洞三、Burp工具的使用四、渗透测试1. 渗透测试类型2. 脆弱性评估 五、常见的应用安全风险1. 注入2. 失效的身份认证3. 敏感数据泄露4. XML外部实体(XXE)5. 失效的访问控制6. 安全配置错误7. 跨站脚本:(XSS)8. 不安全的反序列…

旅游行业内容管理系统CMS提升网站建设效率与体验

内容概要 在如今快速发展的互联网时代&#xff0c;旅游行业对网站的要求越来越高&#xff0c;内容管理系统&#xff08;CMS&#xff09;的应用不可或缺。以 Baklib 为代表的先进CMS可显著提高旅游网站的建设效率与用户体验。为了满足不断变化的市场需求&#xff0c;这些系统通…

数据库安全、分布式数据库、反规范化等新技术(高软19)

系列文章目录 3.7数据库安全、分布式数据库、反规范化等新技术 前言 本节数据库安全、分布式数据库、反规范化等新技术相关概念与技术。 一、数据库 1.数据库安全 2.数据库备份 二、分布式数据库 1.数据库分布 2.数据仓库 3.数据仓库结构 4.商业智能&#xff08;BI&#xf…

【docker知识】快速找出服务器中占用内存较高的容器

本文由Markdown语法编辑器编辑完成。 1.背景&#xff1a; 近期在处理现场问题&#xff0c;观察服务器时&#xff0c;会遇到某些进程占用较高内存的情况。由于我们的服务&#xff0c;基本上都是以容器的方式在运行&#xff0c;因此就需要找到&#xff0c;到底是哪个容器&#…

【Android开发】华为手机安装包安装失败“应用是非正式版发布版本,当前设备不支持安装”问题解决

问题描述 我们将Debug版本的安装包发送到手机上安装&#xff0c;会发现华为手机有如下情况 解决办法 在文件gradle.properties中粘贴代码&#xff1a; android.injected.testOnlyfalse 最后点击“Sync now”&#xff0c;等待重新加载gradle资源即可 后面我们重新编译Debug安装…

docker 部署nginx,nginx 504

遇到问题 原因&#xff1a; 因为用的docker 部署nginx, docker 应用与服务之间的端口未开放&#xff0c;导致访问不到服务。

【数据结构】(8) 二叉树

一、树形结构 1、什么是树形结构 根节点没有前驱&#xff0c;其它节点只有一个前驱&#xff08;双亲/父结点&#xff09;。所有节点可以有 0 ~ 多个后继&#xff0c;即分支&#xff08;孩子结点&#xff09;。每个结点作为子树的根节点&#xff0c;这些子树互不相交。 2、关于…

牛客网-小美的加法(C++)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 小美有一个长度为 n 的数组&#xff0c;她想将这个数组进行求和&#xff0c;即 suma1a2...an。 小美可以使用一次魔法&#xff08;也可以不使用&#xff09;&#xff0c;将其中一个加号…

瑞芯微开发板/主板Android调试串口配置为普通串口方法 深圳触觉智能科技分享

本文介绍瑞芯微开发板/主板Android调试串口配置为普通串口方法&#xff0c;不同板型找到对应文件修改&#xff0c;修改的方法相通。触觉智能RK3562开发板演示&#xff0c;搭载4核A53处理器&#xff0c;主频高达2.0GHz&#xff1b;内置独立1Tops算力NPU&#xff0c;可应用于物联…