QT 学习笔记(十三)

news2024/12/28 23:15:56

文章目录

  • 一、QDataStream 二进制文件读写
    • 1. QDataStream 简介
    • 2. QDataStream 实际演示
      • 2.1 QDataStream 读写文件操作
      • 2.2 实现代码——主窗口头文件 widget.h
      • 2.3 实现代码——主窗口源文件 widget.cpp
  • 二、QTextStream 文本文件读写
    • 1. QTextStream 简介
    • 2. QTextStream 实际演示
      • 2.1 QTextStream 读写文件操作
      • 2.2 实现代码——主窗口头文件 widget.h
      • 2.3 实现代码——主窗口源文件 widget.cpp
  • 三、QBuffer
    • 1. QBuffer 简介和操作实现
    • 2. 实现代码——主窗口源文件 widget.cpp

由于每次代码都是在原有程序上修改,因此除了新建项目,不然一般会在学完后统一展示代码。
提示:具体项目创建流程和注意事项见QT 学习笔记(一)
提示:具体项目准备工作和细节讲解见QT 学习笔记(二)

一、QDataStream 二进制文件读写

  • 生成一个新的项目,具体步骤过程见提示。

1. QDataStream 简介

  • QDataStream 提供了基于 QIODevice 的二进制数据的序列化。
  • 数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。例如,在安装了 Windows 平台的 PC 上面写入的一个数据流,可以不经过任何处理,直接拿到运行了 Solaris 的 SPARC 机器上读取。由于数据流就是二进制流,因此我们也可以直接读写没有编码的二进制数据,例如图像、视频、音频等。
  • QDataStream 既能够存取 C++ 基本类型,如 int、char、short 等,也可以存取复杂的数据类型,例如自定义的类。
  • 实际上,QDataStream 对于类的存储,是将复杂的类分割为很多基本单元实现的。
  • 结合 QIODevice,QDataStream 可以很方便地对文件、网络套接字等进行读写操作。
  • 那么,既然 QIODevice 提供了 read()、readLine() 之类的函数,为什么还要有 QDataStream 呢? DataStream 同 QIODevice 有什么区别?
  • 区别在于,QDataStream 提供流的形式,性能上一般比直接调用原始 API 更好一些

2. QDataStream 实际演示

2.1 QDataStream 读写文件操作

  • 在这里就不通过 ui 界面进行文件的操作演示了,直接通过代码执行操作。
  • 我们先编写一个文件,随后在对其进行读操作。
  • 因为,我们仍然需要打开文件,关联文件路径,所有,需要有头文件 #include < QFile >
  • 通过编写代码并运行,会在根目录下生成一个名为 test.txt 的文本文件,实现结果如下图所示:

在这里插入图片描述

  • 这里我们会发现,在 QT 的运行结果上没有任何显示结果,此时,我们打开在根目录下生成的 test.txt 文件,得到如下结果。

在这里插入图片描述

  • 这个 test.txt 文本文件我们打开后发现是乱码,这主要是因为 QDataStream 是对二进制文件进行操作,这导致我们直接打开是以乱码的形式展现出来。
  • 如果我们想要阅读 test.txt 文本文件的内容可以通过读文件的方式使其展现。
  • 唯一需要注意的是,这里必须按照写入的顺序,将数据读取出来。顺序颠倒的话,程序行为是不确定的,严重时会直接造成程序崩溃。
  • 通过编写代码,并运行,得到如下运行结果:

在这里插入图片描述

  • 在文件操作中,我们可以感受到 qDebug() 使用起来是略微有点不便的,可以通过定义一种转换方式,使其变为在 C++ 里面经常使用的 cout 进行输出,代码如下:
#define cout qDebug() << "[" << __FILE__ << ":" << __LINE__ << "]"
  • 在这句代码当中,会先输入 [ 和文件路径,再输出该语句所在的行号和 ] ,最后输出我们所打印的内容,实现结果如下图所示:

在这里插入图片描述

2.2 实现代码——主窗口头文件 widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

    //写文件
    void writeData();

    //读文件
    void readData();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

2.3 实现代码——主窗口源文件 widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDataStream>
#include <QFile>
#include <QDebug>
#define cout qDebug() << "[" << __FILE__ << ":" << __LINE__ << "]"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    writeData();
    readData();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::writeData()
{
    //创建文件对象
    QFile file("../test.txt");

    //打开文件,以只写方式打开
    bool isok = file.open(QIODevice::WriteOnly);
    if(isok==true)
    {
        //创建数据流,和file文件关联
        //往数据流中写数据,相当于往文件里写数据
        QDataStream stream(&file);

        stream << QString("主要看气质") << 250;//结果文件里都是不可见的二进制数据

        file.close();

    }
}

void Widget::readData()
{
    //创建文件对象
    QFile file("../test.txt");

    //打开文件,以只读方式打开
    bool isok = file.open(QIODevice::ReadOnly);
    if(isok==true)
    {
        //创建数据流,和file文件关联
        //往数据流中读数据,相当于往文件里读数据
        QDataStream stream(&file);

        //读的时候,按写的顺序取数据
        QString str;
        int a;
        stream >> str >> a;
        //qDebug() << str.toUtf8().data() << a;
        cout << str.toUtf8().data() << a;

        file.close();

    }
}

二、QTextStream 文本文件读写

  • 生成一个新的项目,具体步骤过程见提示。

1. QTextStream 简介

  • 二进制文件比较小巧,却不是人可读的格式。而文本文件是一种人可读的文件。为了操作这种文件,我们需要使用 QTextStream 类。
  • QTextStream 和 QDataStream 的使用类似,只不过它是操作纯文本文件的。
  • QTextStream 会自动将 Unicode 编码同操作系统的编码进行转换,这一操作对开发人员是透明的。
  • 同时,它也会将换行符进行转换,同样不需要自己处理。
  • QTextStream 使用 16 位的 QChar 作为基础的数据存储单位,同样,它也支持 C++ 标准类型,如 int 等。实际上,这是将这种标准类型与字符串进行了相互转换。
  • 当使用 QDataStream 写入的时候,实际上会在要写入的内容前面,额外添加一个这段内容的长度值。而以文本形式写入数据,是没有数据之间的分隔的。因此,使用文本文件时,很少会将其分割开来读取,而是使用诸如使用:
QTextStream::readLine()//读取一行
QTextStream::readAll()//读取所有文本
  • 这种函数之后再对获得的 QString 对象进行处理。
  • 默认情况下,QTextStream 的编码格式是 Unicode,如果我们需要使用另外的编码,可以使用如下函数进行设置。
stream.setCodec("UTF-8");
  • 知识点补充:在 QT 的文件操作当中,有如下的打开方式:
枚举值描述
QIODevice::NotOpen未打开
QIODevice::ReadOnly以只读方式打开
QIODevice::WriteOnly以只写方式打开
QIODevice::ReadWrite以读写方式打开
QIODevice::Append以追加的方式打开,新增加的内容将被追加到文件末尾
QIODevice::Truncate以重写的方式打开,在写入新的数据时会将原有数据全部清除,游标设置在文件开头
QIODevice::Text在读取时,将行结束符转换成 \n;在写入时,将行结束符转换成本地格式,例如 Win32 平台上是 \r\n
QIODevice::Unbuffered忽略缓存

2. QTextStream 实际演示

2.1 QTextStream 读写文件操作

  • QTextStream 与 QDataStream 类似,在这里也不使用 ui 界面进行文件的操作演示了,直接通过代码执行操作。
  • 我们先编写一个文件,随后在对其进行读操作。
  • 通过编写代码并运行,会在根目录下生成一个名为 demo.txt 的文本文件,实现结果如下图所示:

在这里插入图片描述

  • 这里我们会发现,在 QT 的运行结果上没有任何显示结果,此时,我们打开在根目录下生成的 demo.txt 文件,得到如下结果。

在这里插入图片描述

  • 这个 demo.txt 文本文件我们打开后发现是正常的汉字和数字,这是因为 QTextStream 针对的是文本文档,可以直接被人们阅读。
  • 如果我们想要阅读 demo.txt 文本文件的内容可以通过读文件的方式使其展现。
    唯一需要注意的是,这里必须按照写入的顺序,将数据读取出来。顺序颠倒的话,程序行为是不确定的,严重时会直接造成程序崩溃。
  • 通过编写代码,并运行,得到如下运行结果:

在这里插入图片描述

  • 但是通过现象我们会发现最后多了一个 0 ,这是因为他直接将主要看气质和 250 看作为一个整体赋值给 str ,那么 a 就会没有赋值,变为 0。
  • 因此,这种读文件的方式是错误的。
  • 正确的读文件方法是在 ui 界面进行窗口的设计,通过 QTextStream::readAll() 的方式进行阅读,如下图现象所示。

在这里插入图片描述

2.2 实现代码——主窗口头文件 widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

    //写文件
    void writeData();

    //读文件
    void readData();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

2.3 实现代码——主窗口源文件 widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QTextStream>
#include <QFile>
#include <QFileDialog>
#include <QDebug>
#define cout qDebug() << "[" << __FILE__ << ":" << __LINE__ << "]"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    writeData();
    readData();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::writeData()
{
    QFile file;
    file.setFileName("../demo.txt");

    bool isok = file.open(QIODevice::WriteOnly);
    if(true == isok)
    {
        QTextStream stream(&file);

        //指定编码方式
        stream.setCodec("UTF-8");

        stream << QString("主要看气质") << 250;

        file.close();
    }
}

void Widget::readData()
{
    QFile file;
    file.setFileName("../demo.txt");

    bool isok = file.open(QIODevice::ReadOnly);
    if(true == isok)
    {
        QTextStream stream(&file);

        //指定编码方式
        stream.setCodec("UTF-8");

        QString str;
        int a;
        stream >> str >> a;

        //qDebug() << str << a;
        cout << str << a;

        file.close();
    }
}

void Widget::on_pushButton_clicked()
{
    QString path = QFileDialog::getOpenFileName(this,"open","../");
    if(false == path.isEmpty())
    {
        QFile file;
        file.setFileName(path);

        bool isok = file.open(QIODevice::ReadOnly);
        if(true == isok)
        {
            QTextStream stream(&file);

            //指定编码方式
            stream.setCodec("UTF-8");

            QString str = stream.readAll();
            ui->textEdit->setText(str);
        }
    }
}

三、QBuffer

  • 生成一个新的项目,具体步骤过程见提示。

1. QBuffer 简介和操作实现

  • QBuffer 与文件操作并没有太大关系,是放在内存里面的。
  • 在使用 QBuffer 的过程中,不需要在头文件下进行函数的声明,可以直接在构造函数中进行代码的编写,得到如下图所示现象。

在这里插入图片描述

  • 通过现象,我们可以发现,他将两个合为一行,连在一块。如果我们想要将其分行显示,需要 \n 。
  • 但这里需要注意的是不可以直接加 \n ,不然会被当成字符直接输出,这里需要使用转义字符。
  • 除此以外,我们也可以定义所编写的内容放到哪个缓冲区当中,具体结果如下图现象所示。

在这里插入图片描述

  • 此外,QBuffer 也可以与 QDataStream 配合使用,具体结果如下图现象所示。

在这里插入图片描述

  • 这里必须按照写入的顺序,将数据读取出来。读文件操作现象具体如下图所示

在这里插入图片描述

2. 实现代码——主窗口源文件 widget.cpp

  • 主窗口头文件 widget.h 没有变化。
#include "widget.h"
#include "ui_widget.h"
#include <QBuffer>//内存文件
#include <QDebug>
#include <QDataStream>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //写文件
    QByteArray array;

    //创建内存文件
    QBuffer memFile(&array);
    memFile.open(QIODevice::WriteOnly);

    memFile.write("111111");
    memFile.write("222222");

    memFile.close();

    qDebug() << memFile.buffer();
    qDebug() << "array" << array;

    QBuffer memFile1;
    memFile1.open(QIODevice::WriteOnly);
    QDataStream stream(&memFile1);
    stream << QString("测试") << 250;
    memFile1.close();

    qDebug() << memFile.buffer();

    //读文件
    memFile1.open(QIODevice::ReadOnly);
    QDataStream stream1;
    stream1.setDevice(&memFile1);
    QString str;
    int a;
    stream1 >> str >> a;
    memFile1.close();

    qDebug() << str.toUtf8().data() << a;
}

Widget::~Widget()
{
    delete ui;
}

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

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

相关文章

【王道操作系统】3.2.3 页面置换算法(最佳置换算法、先进先出置换算法、最近最久未使用置换算法、普通时钟置换算法、改造型时钟置换算法)

页面置换算法(最佳置换算法、先进先出置换算法、最近最久未使用置换算法、普通时钟置换算法、改造型时钟置换算法) 文章目录页面置换算法(最佳置换算法、先进先出置换算法、最近最久未使用置换算法、普通时钟置换算法、改造型时钟置换算法)1.最佳置换算法---OPT2.先进先出置换算…

[安洵杯 2019]不是文件上传(文件名不能用“,数据库可识别hex编码)

打开题目尝试上传文件发现只能上传图片&#xff0c;然后看见了图片的路径&#xff0c;但是图片码连不上蚁键&#xff0c;结合题目&#xff0c;然后看到了题目给出的github源码 <?php include("./helper.php"); $show new show(); if($_GET["delete_all&qu…

STS安装,SVN配置及WEB工程配置简单说明_1.0.0

Spring Tool Suite构建java web项目概述1, 下载安装Spring Tool Suite Spring Tool Suite 简称为sts, 为构建基于Spring企业应用&#xff0c;提供了最好的Eclipse开发环境。STS 提供了最新基于Java和Spring应用所需要的所有工具,STS官网主页地址为http://spring.io/tools/sts/,…

画布创作,签名大致就是起笔落笔

画布创作&#xff0c;签名大致就是起笔落笔 前言 在画布创作过程中&#xff0c;签名手的基本形态是&#xff0c;不停的点、划。 就像我们写字一样&#xff0c;字越写越大&#xff0c;但是我们不知道笔画的大小。 一个字是一个非常小的点、横&#xff0c;一个横就把这个字给分…

JVM学习(一):简单聊聊性能调优这门艺术

一、性能调优背景说明1.1 生产环境中的问题生产环境发生了内存溢出该如何处理&#xff1f;生产环境应该给服务器分配多少内存合适&#xff1f;如何对垃圾回收器的性能进行调优&#xff1f;生产环境CPU负载飙高该如何处理&#xff1f;生产环境应该给应用分配多少线程合适&#x…

2-2进程管理-处理机调度

文章目录一.调度的层次二.进程调度的时机、切换与过程、调度方式三.调度器、闲逛进程四.调度算法的评价指标五.调度算法&#xff08;一&#xff09;先来先服务SCFS&#xff08;二&#xff09;短作业优先算法SJF&#xff08;三&#xff09;高响应比优先HRRN&#xff08;四&#…

cas6.6关于redis连接问题的一次记录,主要问题 1远程主机强迫关闭了一个现有的连接,主要问题2ERR unknown command `HELLO`

项目背景&#xff1a; 公司要求用cas单点登录&#xff0c;这个cas需要引入redis当做ticket缓存&#xff0c;但是出现连接不上的问题由于用redismanager可视化软件看了是可以连接的&#xff0c;进行了查询是redis配置文件中需要配置参数问题截图如下 问题输出如下 2023-01-04…

192:vue+openlayers: 选择feature,弹窗操作,删除所选feature

第192个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayer中使用select来选择feature元素,选择的过程中弹窗出现删除和关闭按钮,删除的内容是selected的feature,关闭的是功能浮窗。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果Ope…

《设计模式》模板方法模式

《设计模式》模板方法模式定义&#xff1a; 模板方法模式又叫模板模式&#xff0c;在一个抽象类中公开定义了执行它的方法的模板&#xff0c;子类可以根据需要重写方法实现&#xff0c;但是调用将按照抽象类中定义的方式进行。模板方法模式相当于定义了一个操作中算法的骨架&a…

回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入多输出

回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入多输出 目录回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入多输出预测效果基本介绍程序设计往期精彩参考资料预测效果 基本介绍 MATLAB实现CNN-GRU卷积门控循环单元多输入多输出&#xff0c;运行环境Matlab2020及以上…

【国科大模式识别】第三次作业

【题目一】现有四个来自于两个类别的二维空间中的样本, 其中第一类的两个样本为 (1,4)T(1,4)^T(1,4)T 和 (2,3)T(2,3)^T(2,3)T, 第二类的两个样本为 (4,1)T(4,1)^T(4,1)T 和 (3,2)T(3,2)^T(3,2)T 。这里, 上标 TTT 表示向量转置。若采用规范化增广样本表示形式, 并假设初始的权…

权限问题的理解——Linux

这里是目录标题一、重定向二、 学Linux的意义三、shell命令的运行原理四、Linux权限管理1.Linux中具体用户的分类五、Linux文件相关的权限概念文件类型文件的权限文件的权限操作去掉权限加上权限八进制文件权限操作更改文件的拥有者和所属组六、目录的权限七、默认权限权限掩码…

树莓派项目归档

Flask Flask登录注册界面美化 Flask 修改路由 Flask 创建404json返回 返回虚拟温湿度 Flask-移植开发环境到VSCode-手机局域网访问测试 Flask AJAX 获取数据 Flask 将项目从win部署到树莓派 添加监控窗口 Flask 编写shell脚本快速启动服务 树莓派 树莓派4B Ubuntu MAT…

leetcode螺旋矩阵总结

螺旋矩阵题目&#xff1a; leetcode54&#xff0c;59&#xff0c;885&#xff0c;2326 leetcode54 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 输入&#xff1a;matrix [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出&#xff1a;[…

MSTP技术中引入的必要性

目前&#xff0c;城域光传送网大量存在的是传统的SONET/SDH环网和简单的MSTP网络&#xff0c;对带宽的指配基本上是静态的&#xff0c;无法适应大量的突发性数据业务&#xff0c;需要大量的人工操作和维护&#xff0c;耗时耗力、容易出错。为了改变现状&#xff0c;人们不断在传…

第二章 Flink 环境部署

Flink 系列教程传送门 第一章 Flink 简介 第二章 Flink 环境部署 第三章 Flink DataStream API 第四章 Flink 窗口和水位线 第五章 Flink Table API&SQL 第六章 新闻热搜实时分析系统 一、Flink架构 Flink 是一个分布式系统&#xff0c;需要有效分配和管理计算资源…

python-turtle画图

认识TurtleTurtle是一个渲染器基于底层图形编程结构(API)构建&#xff0c;主要用于场景的构建以及3D物体的绘制(3D游戏、虚拟场景等)Turtle是一个窗体程序Turtle是Python语言中的一个很流行的绘制图像的函数库&#xff0c;想象一个小海龟在一个横轴为x&#xff0c;纵轴为y的坐标…

时序数据库 TDengine 携手北京科技大学设计研究院,助力冶金工业智慧化

北京科技大学设计研究院有限公司作为北京科技大学全资产业化技术推广机构&#xff0c;从 2013 年开始在冶金、钢铁行业进行业务系统开发和实施&#xff0c;围绕先进材料、绿色低碳和智能制造不断深耕细作&#xff0c;持续创新。其拥有高效轧制与智能制造国家工程研究中心、国家…

DPDK工作原理和环境搭建

DPDK工作原理DPDK环境搭建编译DPDKDPDK工作原理DPDK实践之处理UDP数据总结DPDK环境搭建 工具准备&#xff1a;VMware、ubuntu16.04。 &#xff08;1&#xff09;VMware添加两个网卡。桥接网卡作为 DPDK 运行的网卡&#xff0c;NAT 网卡作为 ssh 连接的网卡。 &#xff08;2&…

后台交互—springboot+mybatis整合小程序(源码演示)

后台准备pom.xml<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM…