Qt系列文章之 QDataStream

2023-11-14

上一篇文章介绍了如何使用QFileDialog来选择文件路径并读入项目界面,本文介绍如何使用Qt的序列化技术来将用户定义的一些变量保存到文件,用到的主要模块是QDataStream。

对象序列化 QDataStream

Qt提供了两个关键的二进制序列化模块:QDataStreamQTextStream,本文主要介绍常用简单对象二进制序列化技术QDataStream。希望在界面关闭的时候自动将用户修改的界面属性值保存到一个文件之中,以便后面读入的时候使用。 当然这种操作还有更好的方式,比如编写配置文件或者QSettings,此处只是为了使用模块而构造的一个场景。
在这里插入图片描述

开始之前,我们需要先引入一个关键的事件QCloseEvent,这个事件是用户在关闭界面时自动调用。 按照前面对事件的介绍,Qt中的事件函数一般都是基于事件虚函数重写即可。首先我们要在头文件包含QCloseEvent
#include <QCloseEvent>

然后在头文件的protected区域重定义这个事件处理函数:

protected:
    void closeEvent(QCloseEvent *event) override;   //重写事件函数

在CPP源文件中重写事件处理代码,一般的开发习惯是在最后将事件处理权限交回父类对象之中。

void mainWindow::closeEvent(QCloseEvent *event)
{
    /*编写你的事件处理函数*/

    return QMainWindow::closeEvent(event); //最后将事件处理交回父类
}

下一步构造一个属性序列化类,在关闭窗口的时候将界面的一些属性保存到本地硬盘之中,方便下次打开界面时读入上次的配置参数。

和前面一样,首先构造一个文件写操作,判断文件是否打开正常:

    QFile file("config.ini");
    if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
        return; //打开失败关闭

然后基于某IO对象(此处是file)构造一个数据序列化对象 out:
QDataStream out(&file);

为了保险,设置out的数据版本:

out.setVersion(QDataStream::Qt_4_0);  //最好设置数据保存版本

依次写入界面的一些信息,此处主要写入了下拉菜单、编辑框和表格的信息:

    out<<ui->lineEdit_input->text()              //写入编辑框的值
        <<qint8(ui->downList->currentIndex());   //写入下拉菜单编号

    qint8 rowCount = ui->tableWidget->rowCount(); //写入表格行数
    out<<rowCount;

    for (int i=0;i<rowCount;i++) {               //写入表格每行内容
        out<<ui->tableWidget->item(i,0)->text()<<ui->tableWidget->item(i,1)->text();
    }

最后关闭文件:

file.close();                                //关闭文件

打开界面修改之后,项目时会将一些信息保存到文件config.ini之中。可以在文件夹路径打开文件,由于保存的是二进制文件,所以有一些信息无法以文本形式显示:
在这里插入图片描述

下次再打开界面时,我们希望能够直接读入这些信息进入界面,下面来实现这个读入的操作:

这个过程也可以使用界面打开时的事件函数paintEvent(QPaintEvent *event)或者showEvent(QShowEvent *event)来处理。 但是此处我们采用槽函数的方式来处理,下面定义一个槽函数:

void readIniFile(); //读入配置信息

在cpp源文件之中对槽函数进行实现:

void mainWindow::readIniFile()
{
}

下面在槽函数之中来对读入文件信息的代码进行实现,首先构造一个文件对象,然后判断是否打开正常,然后基于文件构造一个in对象:

    QFile file("config.ini");
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return; //打开失败关闭

    QDataStream in(&file);
    in.setVersion(QDataStream::Qt_4_0);  //最好设置数据保存版本

然后依次读入信息并修改界面的值,注意读入的顺序需要前面写入的一样,同时读入的值类型也要一样,特别是qint8的使用,读者可以分析一下原因。

    QString lineEditText;
    qint8 comboBoxIndex;
    in>>lineEditText>>comboBoxIndex;              //读入信息
    ui->lineEdit_input->setText(lineEditText);    //修改编辑框的值
    ui->downList->setCurrentIndex(int(comboBoxIndex));  //修改下拉菜单序号

    qint8 rowCount;
    in>>rowCount;
    for (int i=0;i<int(rowCount);i++)          //读入并修改表格各个单元格的值
    {
        QString str1;
        QString str2;
        in>>str1>>str2;
        ui->tableWidget->item(i,0)->setText(str1);
        ui->tableWidget->item(i,1)->setText(str2);
    }

最后记得关闭文件对象:
file.close(); //关闭文件对象

最后如果界面再打开始时就能读入信息,需要在构造函数中调用定义的槽函数:

    ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); //表格均匀布满水平内容

    connect(ui->btu_click,&QPushButton::clicked,this,&mainWindow::btnClicked); //建立信号和槽的联系
    connect(ui->lineEdit_input,&QLineEdit::editingFinished,this,&mainWindow::inputFinished); //建立信号和槽的联系
    connect(ui->downList,&QComboBox::currentTextChanged,this,&mainWindow::chooseChanged); //建立信号和槽的联系

    readIniFile();  //构造函数中调用槽函数

然后编译运行代码,修改一些界面值:
在这里插入图片描述

关闭界面,然后再打开界面,界面会记录上次修改的值:
在这里插入图片描述

本文以界面配置信息保存为例来介绍如何使用QDataStream进行序列化的读写操作过程。不是所有的对象都能够被QDataStream序列化处理,Qt给出了可以处理的序列化对象如下,对于用户自己开发的复杂对象想要序列化,需要自己构造对象的“<<”和“>>”运算符。

bool • boolean
qint8 • signed byte
qint16 • signed 16-bit integer
qint32 • signed 32-bit integer
qint64 • signed 64-bit integer
quint8 unsigned byte
quint16 unsigned 16-bit integer
quint32 unsigned 32-bit integer
quint64 unsigned 64-bit integer
float 32-bit floating point number using the standard IEEE 754 format
double 64-bit floating point number using the standard IEEE 754 format
const char* - The string length (quint32)
-The string bytes, excluding the terminating 0
QBitArray - The array size (quint32)
-The array bits, i.e. (size + 7)/8 bytes
QBrush -The brush style (quint8)
-The brush color (QColor)
-If style is CustomPattern, the brush pixmap (QPixmap)
QByteArray -If the byte array is null: 0xFFFFFFFF (quint32)
- Otherwise: the array size (quint32) followed by the array bytes, i.e. size bytes
QColor Color spec (qint8)
Alpha value (quint16)
Red value (quint16)
Green value (quint16)
Blue value (quint16)
Pad value (quint16)
QCursor Shape ID (qint16)
If shape is BitmapCursor: The bitmap (QPixmap), mask (QPixmap), and hot spot (QPoint)
QDate Julian day (quint32)
QDateTime Date (QDate)
Time (QTime)
The time spec offsetFromUtc (qint32) if Qt::TimeSpec is offsetFromUtc TimeZone(QTimeZone) if Qt::TimeSpec is TimeZone
QEasingCurve type (quint8)
func (quint64)
hasConfig (bool)
If hasConfig is true then these fields follow:
list
period (double)
amplitude (double)
overshoot (double)
QFont The family (QString)
The style name (QString)
The point size (double)
The pixel size (qint32)
The style hint (quint8)
The style strategy (quint16)
The char set (quint8)
The weight (quint8)
The font bits (quint8)
The font stretch (quint16)
The extended font bits (quint8)
The letter spacing (double)
The word spacing (double)
The hinting preference (quint8)
QHash<Key, T> The number of items (quint32)
For all items, the key (Key) and value (T)
QIcon The number of pixmap entries (quint32)
For all pixmap entries:
The pixmap (QPixmap)
The file name (QString)
The pixmap size (QSize)
The mode (quint32)
The state (quint32)
QImage If the image is null a “null image” marker is saved; otherwise the image is saved in PNG or BMP format (depending on the stream version). If you want control of the format, stream the image into a QBuffer (using QImageIOHandler/QImageIOPlugin) and stream that.
QKeySequence A QList, where each integer is a key in the key sequence
QLinkedList < T > The number of items (quint32)
The items (T)
QList< T> The number of items (quint32)
The items (T)
QMap<Key, T> The number of items (quint32)
For all items, the key (Key) and value (T)
QMargins left (int)
top (int)
right (int)
bottom (int)
QMatrix m11 (double)
m12 (double)
m21 (double)
m22 (double)
dx(double)
dy (double)
QMatrix4x4 m11 (float)
m12 (float)
m13 (float)
m14 (float)
m21 (float
m22 (float)
m23 (float)
m24 (float)
m31 (float)
m32 (float
m33 (float)
m34 (float)
m41 (float)
m42 (float)
m43 (float
m44 (float)
QPair<T1, T2> first (T1)
second (T2)
QPalette The disabled, active, and inactive color groups, each of which consists of the following:
foreground (QBrush)
button (QBrush)
light (QBrush)
midlight (QBrush)
dark (QBrush)
mid (QBrush)
text (QBrush)
brightText (QBrush)
buttonText (QBrush)
base (QBrush)
background (QBrush
shadow (QBrush)
highlight (QBrush)
highlightedText (QBrush
link (QBrush)
linkVisited (QBrush)
QPen The pen styles (quint8)
The pen width (quint16)
The pen color (QColor)
QPicture The size of the picture data (quint32)
The raw bytes of picture data (char)
QPixmap Save it as a PNG image.
QPoint The x coordinate (qint32)
The y coordinate (qint32)
QQuaternion The scalar component (float)
The x coordinate (float)
The y coordinate (float)
The z coordinate (float)
QRect left (qint32)
top (qint32)
right (qint32)
bottom (qint32)
QRegExp The regexp pattern (QString)
Case sensitivity (quint8)
Regular expression syntax (quint8)
Minimal matching (quint8)
QRegularExpression The regular expression pattern (QString)
The pattern options (quint32)
QRegion The size of the data, i.e. 8 + 16 * (number of rectangles) (quint32)
10 (qint32)
The number of rectangles (quint32)
The rectangles in sequential order (QRect)
QSize width (qint32)
height (qint32)
QString If the string is null: 0xFFFFFFFF (quint32)
Otherwise: The string length in bytes (quint32) followed by the data in UTF-16
QTime Milliseconds since midnight (quint32)
QTransform m11 (double)
m12 (double)
m13 (double)
m21 (double)
m22 (double)
m23 (double)
m31 (double)
m32 (double)
m33 (double)
QUrl Holds an URL (QString)
QVariant The type of the data (quint32)
The null flag (qint8)
The data of the specified type
QVector2D the x coordinate (float)
the y coordinate (float)
QVector3D the x coordinate (float)
the y coordinate (float)
the z coordinate (float)
QVector4D the x coordinate (float)
the y coordinate (float)
the z coordinate (float)
the w coordinate (float)
QVector< T> The number of items (quint32)
The items (T)

欢迎同好沟通交流,批评指正,欢迎关注我的公号:不如起而行之

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt系列文章之 QDataStream 的相关文章

  • 如何搭建qtwayland?

    我花了一整天的时间尝试使用QtWayland Compositor 1 0在 Qt 创建者中 我已经遵循了从那里开始的所有步骤https wiki qt io QtWayland https wiki qt io QtWayland但我收到
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • 如何在 QT 安装程序框架中区分每用户安装与系统范围安装?

    我正在使用一些名为 pgModeler 的应用程序 它的当前版本提供了一个基于 QT 安装程序框架的安装程序 Windows 上该安装程序的问题是它安装每个用户的开始菜单条目 https github com pgmodeler pgmod
  • QPainter 性能高帧率

    我试图在 QPainter 中以 60fps 的速度显示视频 在 OpenGLwidget 中 我遇到一个问题 有时绘图花费的时间太长 并且在使用 QPainter 时发生下一个重绘事件 这会生成警告和随机崩溃 有几个问题 是否有一种 Qt
  • 如何在qt中进行异步文件io?

    我想知道如何在qt中实现异步文件io 这在普通的 qt 中是否可以实现 或者有人需要使用另一个库 例如 libuv 来实现这样的事情 我正在查看 QDataStream 但即使它是一个 流 它也不是非阻塞的 我想一种解决方案是制作一个在内部
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • 使用 QTextCursor 选择一段文本

    使用 Qt 框架选择文本片段时遇到问题 例如 如果我有这个文件 没有时间休息 我想选择 ime for r 并从文档中删除这段文本 我应该如何使用 QTextCursor 来做到这一点 这是我的代码 QTextCursor cursor n
  • 在哪里可以找到 QT 5.3.0 命令提示符

    用于学习Qt的书 C gui programming with qt 4 2nd 版 我需要Qt的命令提示符 我已经安装了Qt 5 3 0 creator 5 3 0开源 但不知道它的命令提示符在哪里 有人可以帮助我吗 我认为您正在寻找的是
  • 如何在 QT 中绘制点?

    我正在用 QT 用 C 编写一个应用程序 其中有 n 个点并计算它的凸包 然而 一旦计算出来 我不知道如何绘制点并绘制船体的边界 制作菜单按钮等很简单 但我不确定我是否知道执行此操作的工具 你怎么做到这一点 图形视图 addEllipse
  • 如何使 Python、QT 和 Webkit 在无头服务器上工作?

    我有 Debian Linux 服务器 我用它来做各种事情 我希望它能够完成一些我需要定期完成的网络抓取工作 这段代码可以是在这里找到 http bit ly QeqvzX import sys from PyQt4 QtGui impor
  • 如何在 Qt Creator 中编辑 QtWebKit 的右键上下文菜单?

    好吧 这是我的困境 我正在使用 Qt Creator 制作一个使用 Webkit 的简单应用程序 我认为 Qt Creator 会有一种简单的方法来使用信号和槽编辑器编辑右键单击上下文菜单 但事实证明这不是真的 我知道 webkit 有与上
  • 有没有办法向 QListView 添加部分?

    我正在使用 Qt5 2 和 C 来实现一个应用程序 需要显示一个列表 其中包含类似于下面的示例图像的部分 source ngo hung com http www ngo hung com files images contact list
  • new 运算符(以及 malloc)无法分配约 450 MB 的内存 [重复]

    这个问题在这里已经有答案了 我正在开发一个程序 该程序在内存中存储大约 2 2 亿个短值的数组 该数据块的分配方式如下 short arrayName new short SIZE OF ARRAY 然后将文件的内容读入内存 在团队中的另一
  • 如何声明一个带有成员函数指针的函数

    我有一个类 其中的成员变量指向库对象 class myClassA private libraryClass libraryObject 该库类发出事件 以字符串为特征 并提供一种机制 允许客户端类指定在发出事件时应调用的成员函数 因此在m
  • QML 中可重用的字体属性[重复]

    这个问题在这里已经有答案了 在 QML 中 我希望能够定义一组字体属性以进行简单的语义重用 例如 代替 Text text This is a header font family Encode Sans weight Font Black
  • 如何在针对 Windows XP 的情况下使用 VS2012 构建 Qt 4/5?

    我正在尝试使用 Visual Studio 2012 构建 Qt 4 8 5 Qt 5 2 1 针对 Windows XP SDK v7 1a 使用 VS2102 编译时 源代码与 SDK v7 1a 存在各种不兼容性 因此无法开箱即用 这
  • 连接到 QNetworkReply::error 信号

    我正在使用 Qt5 的新连接语法 QNetworkReply 有一个名为error http qt project org doc qt 5 0 qtnetwork qnetworkreply html error 2还有一个函数叫做err
  • 即使我在单独的线程中运行,QT GUI 也会冻结

    我有一个小型聊天应用程序 其中使用 SQLite 数据库来存储所有对话 我注意到该应用程序随机冻结 然后我必须最小化和最大化它才能使其再次工作 我认为问题可能是 SQLite 选择 插入导致 gui 冻结 我决定尝试将所有 SQLite 方
  • QTabWidget 选项卡在垂直方向,但文本在水平方向

    我正在尝试用 C Qt 制作一个带有这样的侧边栏的应用程序 但是当将 QTabWidget 方向设置为西时 它会使文本垂直 如何让文本位于左侧 但水平对齐 PS 我不需要图标 提前致谢 您可以使用QListWidget http doc q
  • QML 列表视图拖放

    我想创建两个 qml 列表视图 可以执行两个功能 拖放一个列表中的项目以更改项目的顺序 跨列表拖放项目 项目将从一个列表中删除并添加到另一个列表中 根据 Qt 文档中的拖放示例 我决定创建两个访问同一列表模型的列表视图 列表模型中的每个项目

随机推荐

  • java awt linux_解决在linux下awt调用错误的问题

    在java中使用awt在服务器上处理图片的时候发现有错 第一遍执行 500 Servlet Exception java lang InternalError Can t connect to X11 window server using
  • MyBatis自动生成实体类

    MyBatis MySQL生成实体类 需要的工具jar包 mybatis generator core 1 3 2 jar mysql connector java 5 0 4 jar 第一步 编写一个MybatisGeneratorUti
  • android 之 如何让app没有图标

    我们有时候需要让我们的app没有图标 不要问我没有图标要干啥 我只是说的一个需求 单讲技术不说别的 首先我们要获得 PackageManager 的对象 PackageManager packageManager getPackageMan
  • Caffeine缓存的使用

    1 springboot集成Caffeine
  • KeePass搭建一个私人密码库

    文章作者 GoodBoyboy 文章链接 https blog goodboyboy top posts 2546190081 html 版权声明 本博客所有文章除特别声明外 均采用 CC BY NC SA 4 0 许可协议 转载请注明来自
  • 线程(进程)的同步与互斥实例

    1 有一个队列 线程1负责从网络接收分组 并将收到的分组放到队列尾 然后再次从网络中接收下一个到达的分组 并进行同样的队列操作 线程2从此队列头中取出一个分组进行处理 处理完毕后 再次从队列中取出一个分组进行处理 处理完毕后再次从队列头取出
  • [转]Python实现多功能音乐播放器

    前言 就是用Python做一个简易的音乐播放器 废话不多说 咱们直接开干 当然 今天做这个肯定不是最简单的 最简单的音乐播放器 9行代码足以 import time import pygame file r 歌曲路径 pygame mixe
  • torch.hub.load()解析,如何加载本地权重

    用yolov5训练了一个权重 项目只能部署在本地 官方文档 torch hub load repo or dir model args source github force reload False verbose True skip v
  • Python 第一阶段

    第一章 安装 1 1 开发环境 官网 https www python org稳定版 Stable Releases检验 cmd 命令 python version 1 2 开发工具 PyCharm官网 https www jetbrain
  • (Struts2学习篇) Struts2配置文件之 struts-default.xml

    对struts default xml的一些注释
  • zmq+protobuf 的坑点难点

    zmq protobuf 的坑点难点 之前项目要用到zmq protobuf的方式传递数据 软件采用前后端分离的方式开发 其中前端是异地同事用python开发的 后端是我们这边用C 开发的 1 中间有遇到问题是前后端传送zmq信息时 发现字
  • DRM驱动(七)之atomic_commit

    上节已经把应用的参数check了一遍 这次就可以把对应的参数配置到硬件里进行刷图操作了 int drm atomic commit struct drm atomic state state struct drm mode config c
  • Qt 控制台运行无法弹出小黑框

    Qt Console Application Qt 主要是GUI界面的设计 但在学习的时候控制台运行显得更加方便一些 小编在第一次新建控制台运行的时候 点击运行没有弹出小黑框 解决方法 主要是因为没有执行qmake 就需要在Qt的pro文件
  • RocketMQ 用法详解,你学会了吗?

    大家好 我是指北君 消息中间件是我们工作中使用最频繁的一类中间件 它具有低耦合 可靠投递 广播 流量控制 最终一致性等一系列功能 成为异步RPC的主要手段之一 当今市面上有很多主流的消息中间件 如老牌的ActiveMQ RabbitMQ 炙
  • C++的使用小教程2——基于范围的for循环

    C 的使用小教程2 基于范围的for循环 1 常规的for循环 2 基于范围的for循环 在学习了python之后 一直觉得python的语法很方便 特别是python中遍历数组的方式 无需配置特别的参数就可以完全遍历 C语言是很难实现的
  • zookeeper和Eureka

    简介 Zookeeper 主要为大型分布式计算提供开源的分布式配置服务 同步服务和命名注册 曾经是Hadoop项目中的一个子项目 用来控制集群中的数据 目前已经升级为独立的顶级项目 很多场景下也用它作为Service发现服务解决方案 Eur
  • freessl生成免费ssl

    利用freessl免费生成https https freessl cn acme deploy 官网说明地址 https blog freessl cn acme quick start 下载acme工具包 curl https get a
  • 拟合是什么意思

    在机器学习和统计学中 拟合 Fitting 是指使用模型来适应数据的过程 它表示通过对模型参数进行调整 使模型能够最好地拟合给定的数据集 当我们说一个模型 拟合 了数据时 意味着该模型通过学习数据的模式和结构 能够产生与实际观测数据相匹配的
  • Spring Cloud Alibaba之配置管理组件 - Nacos

    TOC 使用Nacos管理配置 为什么要需要配置管理 在微服务架构中 每个微服务都有可能会存在多个实例 为了保证同一微服务不同实例的配置文件内容一致 我们就需要有一个服务可以对微服务项目的配置文件进行统一管理 通常我们将其称之为统一配置管理
  • Qt系列文章之 QDataStream

    上一篇文章介绍了如何使用QFileDialog来选择文件路径并读入项目界面 本文介绍如何使用Qt的序列化技术来将用户定义的一些变量保存到文件 用到的主要模块是QDataStream 对象序列化 QDataStream Qt提供了两个关键的二