QT 学习笔记(十二)

news2024/9/21 16:24:25

文章目录

  • 一、文件系统
    • 1. 文件系统简介
    • 2. 文件系统分类
  • 二、基本文件操作
    • 1. QFile 读文件
    • 2. QFile 写文件
    • 3. QFileInfo 获取文件信息
  • 三、基本文件操作代码
    • 1. 主窗口头文件 widget.h
    • 2. 主窗口源文件 widget.cpp

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

一、文件系统

1. 文件系统简介

  • 文件操作是应用程序必不可少的部分。
  • QT 作为一个通用开发库,提供了跨平台的文件操作能力。QT 通过 QIODevice 提供了对 I/O 设备的抽象,这些设备具有读写字节块的能力。
  • 下面是 I/O 设备的类图(QT5):

在这里插入图片描述

  • QIODevice:所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口。
  • QFileDevice:Qt5新增加的类,提供了有关文件操作的通用实现。
  • QFlie:访问本地文件或者嵌入资源。
  • QTemporaryFile:创建和访问本地文件系统的临时文件。
  • QBuffer:读写QbyteArray, 内存文件。
  • QProcess:运行外部程序,处理进程间通讯。
  • QAbstractSocket:所有套接字类的父类。
  • QTcpSocket:TCP协议网络数据传输。
  • QUdpSocket:传输 UDP 报文。
  • QSslSocket:使用 SSL/TLS 传输数据。

2. 文件系统分类

  • (1) 顺序访问设备是指它们的数据只能访问一遍:从头走到尾,从第一个字节开始访问,直到最后一个字节,中途不能返回去读取上一个字节,这其中,QProcess、QTcpSocket、QUdpSoctet 和 QSslSocket 是顺序访问设备。
  • (2) 随机访问设备可以访问任意位置任意次数,还可以使用 QIODevice::seek() 函数来重新定位文件访问位置指针,QFile、QTemporaryFile 和 QBuffer 是随机访问设备。

二、基本文件操作

  • 生成一个新的项目,具体步骤过程见提示。
  • 文件操作是应用程序必不可少的部分。QT 作为一个通用开发库,提供了跨平台的文件操作能力。在所有的 I/O 设备中,文件 I/O 是最重要的部分之一。因为我们大多数的程序依旧需要首先访问本地文件(当然,在云计算大行其道的将来,这一观点可能改变)。QFile提供了从文件中读取和写入数据的能力。
  • 我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象最后,使用 setFileName() 来修改。QFile 需要使用 / 作为文件分隔符,不过,它会自动将其转换成操作系统所需要的形式。例如 C:/windows 这样的路径在 Windows 平台下同样是可以的。
  • QFile 主要提供了有关文件的各种操作,比如打开文件、关闭文件、刷新文件等。我们可以使用 QDataStream 或 QTextStream 类来读写文件,也可以使用 QIODevice 类提供的 read()、readLine()、readAll() 以及 write() 这样的函数。值得注意的是,有关文件本身的信息,比如文件名、文件所在目录的名字等,则是通过 QFileInfo 获取,而不是自己分析文件路径字符串。

1. QFile 读文件

  • 首先,需要先在 ui 界面设计出我们预想当中的界面布局。

在这里插入图片描述

  • 通过对 readfile 按钮通过转到槽操作,进行槽函数的代码编写。
  • 在读文件操作当中,先定义 path 通道,在该函数中,第一个参数是指定父对象,第二个参数是标题,第三个参数是路径,第四个参数如果不写的话表示可以打开所有为该标题的文件,如果写就是对打开文件的格式进行限制,在此处举例为 txt 文件。
QString path = QFileDialog::getOpenFileName(this,"open",".../","TXT(*.txt)");
  • 在读文件的过程中,我们需要注意的是默认只识别 utf8 编码的文件,如果非此类文件将会乱码。
  • 如果我们想读取其他类型的文件,需要借助文件流进行操作。
  • 下面展示直接读取全部的实现现象,如下图所示:

在这里插入图片描述

  • 除了直接读取全部文件外,我们也可以一行一行地读取文件,具体现象如下图所示:

在这里插入图片描述

  • QFile 读文件代码如下(需要包含 QFile 和 QFileDialog 两个头文件):
void Widget::on_pushButton_2_clicked()
{
    QString path = QFileDialog::getOpenFileName(this,"open",".../","TXT(*.txt)");

    if(path.isEmpty()==false)
    {
        //文件对象,默认只识别utf8编码
        QFile file(path);

        //打开文件,只读方式
        bool isok=file.open(QIODevice::ReadOnly);
        if(isok==true)
        {
#if 0
            //直接读全部文件
            QByteArray array=file.readAll();
            //显示到编辑区
            ui->textEdit->setText(QString(array));
#endif
            QByteArray array;
            while(file.atEnd()==false)
            {
                //读一行
                array+=file.readLine();
            }
            ui->textEdit->setText(array);
        }

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

2. QFile 写文件

  • 在 QFile 读文件的基础上进行操作。
  • 通过对 writefile 按钮通过转到槽操作,进行槽函数的代码编写。
  • 在写文件操作当中,先定义 path 通道,在该函数中,第一个参数是指定父对象,第二个参数是标题,第三个参数是路径,第四个参数如果不写的话表示打开所有为该标题的文件,如果写就是对打开文件的格式进行限制,在此处举例为 txt 文件。
QString path = QFileDialog::getSaveFileName(this,"save",".../","TXT(*.txt)");
  • 在运行后,我们在文本编辑区编写文本内容,并点击 wirtefile 按钮。

在这里插入图片描述

  • 随后,会在对应的文件目录下生成我们所保存的文件,打开之后就是我们所写的文件。
  • 在 QFile 写文件当中,主要识别的编码方式仍是 Utf8 ,但是,可以通过转换得到我们显示出我们所需要的编码方式。

在这里插入图片描述

  • QFile 写文件代码如下:
void Widget::on_buttonread_clicked()
{
    QString path = QFileDialog::getSaveFileName(this,"save",".../","TXT(*.txt)");
    if(path.isEmpty()==false)
    {
        QFile file;//创建文件对象
        //关联文件名字
        file.setFileName(path);

        //打开文件,只写文件
        bool isok=file.open(QIODevice::WriteOnly);
        if(isok==true)
        {
            QString str=ui->textEdit->toPlainText();
            //写文件
            //在这里需要将 QString 转换为 QByteArray
            file.write(str.toUtf8());
            
            //QString -> c++ string -> char*
            //file.write(str.toStdWString().data());
            
            //转换为本地平台编码(跟window的编码方式一样)
            file.write(str.toLocal8Bit());
            
            //QString -> QByteArray
            QString str1="123";
            QByteArray a = str1.toUtf8();//中文(主要使用)
            a = str1.toLocal8Bit();//本地编码
            
            //QByteArray -> char*
            char *b=a.data();
            
            //char* -> QString
            char *p ="abc";
            QString c=QString(p);
        }

        file.close();
    }
}

3. QFileInfo 获取文件信息

  • 我们可以使用 QFileInfo 获取有关该文件的信息。
  • QFileInfo有很多类型的函数,我们只举出一些例子。比如:
  • (1) isDir()检查该文件是否是目录。
  • (2) isExecutable() 检查该文件是否是可执行文件等。
  • (3) baseName() 可以直接获得文件名;
  • (4) completeBaseName() 获取完整的文件名
  • (5) suffix() 则直接获取文件后缀名。
  • (6) completeSuffix() 获取完整的文件后缀。
  • 我们在读文件的时候顺便获取一下文件信息,具体现象如下图所示:

在这里插入图片描述

  • 具体实现代码如下()想要显示中文名称就需要将其转换为 char * 的格式):
  • toUtf8() 转换为 QByteArray 数组,data() 转换为 char *。
//获取文件信息
QFileInfo info(path);
qDebug() <<"文件名字:"<<info.fileName().toUtf8().data();

qDebug() <<"文件后缀:"<<info.suffix();
qDebug() <<"文件大小:"<<info.size();
//2023-01-01 22:03:00
qDebug() <<"文件创建时间:"<<info.created().toString("yyyy-MM-dd hh:mm:ss");

三、基本文件操作代码

1. 主窗口头文件 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();

private slots:
    void on_pushButton_2_clicked();

    void on_buttonread_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

2. 主窗口源文件 widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QFile>
#include <QFileDialog>
#include <QFileInfo>
#include <QDebug>
#include <QDateTime>
#include <QDataStream>

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

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

void Widget::on_pushButton_2_clicked()
{
    QString path = QFileDialog::getOpenFileName(this,"open",".../","TXT(*.txt)");

    if(path.isEmpty()==false)
    {
        //文件对象,默认只识别utf8编码
        QFile file(path);

        //打开文件,只读方式
        bool isok=file.open(QIODevice::ReadOnly);
        if(isok==true)
        {
#if 0
            //直接读全部文件
            QByteArray array=file.readAll();
            //显示到编辑区
            ui->textEdit->setText(QString(array));
#endif
            QByteArray array;
            while(file.atEnd()==false)
            {
                //读一行
                array+=file.readLine();
            }
            ui->textEdit->setText(array);
        }

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

        //获取文件信息
        QFileInfo info(path);
        qDebug() <<"文件名字:"<<info.fileName().toUtf8().data();
        qDebug() <<"文件后缀:"<<info.suffix();
        qDebug() <<"文件大小:"<<info.size();
        qDebug() <<"文件创建时间:"
                <<info.created().toString("yyyy-MM-dd hh:mm:ss");//2023-01-01 22:03:00
    }
}

void Widget::on_buttonread_clicked()
{
    QString path = QFileDialog::getSaveFileName(this,"save",".../","TXT(*.txt)");
    if(path.isEmpty()==false)
    {
        QFile file;//创建文件对象
        //关联文件名字
        file.setFileName(path);

        //打开文件,只写文件
        bool isok=file.open(QIODevice::WriteOnly);
        if(isok==true)
        {
            QString str=ui->textEdit->toPlainText();
            //写文件
            //在这里需要将 QString 转换为 QByteArray
            file.write(str.toUtf8());

            //QString -> c++ string -> char*
            //file.write(str.toStdWString().data());

            //转换为本地平台编码(跟window的编码方式一样)
            file.write(str.toLocal8Bit());

            //QString -> QByteArray
            QString str1="123";
            QByteArray a = str1.toUtf8();//中文
            a = str1.toLocal8Bit();//本地编码

            //QByteArray -> char*
            char *b=a.data();

            //char* -> QString
            char *p ="abc";
            QString c=QString(p);
        }

        file.close();
    }
}

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

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

相关文章

物联网与射频识别技术,课程实验(三)

实验3—— 时隙ALOHA(S-ALOHA)算法的实现及其性能分析 实验说明&#xff1a; 1. 利用Python或Matlab模拟时隙ALOHA算法&#xff1b; 分析标签数量k、时隙大小t对信道利用率的影响&#xff0c;其中&#xff0c; 信道利用率发送数据的时间/(发送数据的时间信道空闲的时间) 3. …

10、中断系统概述

目录 0x01、异常类型 0x0001、系统异常清单 0x0002、外部中断清单 0x02、NVIC 简介 0x0001、NVIC 寄存器 0x0002、NVIC 中断配置固件库 0x03、优先级 0x0001、优先级定义 0x0002、优先级分组 0x0003、中断编程 0x01、异常类型 STM32F103 在内核水平上搭载了一个异常响…

重金打造SEA浩瀚架构,吉利的野心绝不仅仅是一个平台

&#xff08;作者&#xff1a;贝贝。常年供职于某外资整车企业产品规划部门&#xff0c;负责全球车型在国内的引入和投放&#xff09;最近几个月&#xff0c;吉利旗下的中高端电动车品牌极氪汽车销量一路走高。单凭借极氪001一款车型&#xff0c;10月、11月交付量连续破万&…

查找:折半查找、平衡二叉树、散列表(习题-1、5、6)二叉排序树(习题-2、3、4)

一个不知名大学生&#xff0c;江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.1.1 Last edited: 2023.1.1 目录 查找&#xff1a;折半查找、平衡二叉树、散列表&#xff08;习题-1、5、6&#xff09; 第1关&#xff1…

04.spring源码循环依赖终极讲解

1.Spring怎么解决循环依赖 我们都知道&#xff0c;单例Bean初始化完成&#xff0c;要经历三步&#xff1a; 注入就发生在第二步&#xff0c;属性赋值&#xff0c;结合这个过程&#xff0c;Spring 通过三级缓存解决了循环依赖&#xff1a; 一级缓存 : Map<String,Object>…

PUCCH传输UCI信息

上报HARQ-ACK 时序 传输HARQ-ACK信息的时序不再像4G那样固定&#xff0c;而是由基站侧配置给UE。有下面几种情况&#xff1a; 如果UE收到的是DCI format 1_0&#xff0c;其中的字段’PDSCH-to-HARQ_feedback timing indicatior’指示HARQ-ACK与PDSCH的时序关系&#xff0c;该…

Linux之孤儿进程、进程优先级、环境变量

本章目录1.孤儿进程2.状态优先级3.环境变量1.孤儿进程 父进程如果提前退出&#xff0c;那么子进程后退出&#xff0c;进入Z之后&#xff0c;那该如何处理&#xff1f; 父进程先退出&#xff0c;子进程还在&#xff0c;子进程就称之为“孤儿进程”。 孤儿进程被1号init进程&am…

移动安全APT事件总结及防御解决方案探讨

声明 本文是学习移动安全总结 2019. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 2019年各地移动APT事件总结 2019年世界依旧不太平&#xff0c;在表面平静的背后是暗流涌动。大规模军事冲突不会发生的当下&#xff0c;因利益&#xff0c;…

Python全栈开发(一)——环境搭建和入门

今天是2023年的第一天&#xff0c;接下来的一个月里&#xff0c;我将持续更新关于python全栈开发的相关知识&#xff0c;前面一段时间都是基础语法。主要分成四大块&#xff1a;基础、面向对象、MYSQL数据库、Django框架。话不多说&#xff0c;进入到今天的主题。 1.文档和工具…

聊聊最适合程序员的画图工具

画图工具 没问题&#xff0c;直接坦白讲&#xff0c;我用了 2 年的画图工具是&#xff1a;draw.io。 我的图解文章里的图片全是在 draw.io 这个工具画的&#xff0c;写了那么久的图解文章&#xff0c;再加上我工作中也有画图的习惯&#xff0c;累计也有在上面画了接近 1000 张…

树形压缩DP——没有上司的舞会

树形压缩DP——没有上司的舞会一、问题描述二、DFS暴搜1、算法思路2、代码实现三、DP做法一、问题描述 二、DFS暴搜 1、算法思路 这道题其实最容易想到的是暴力DFS&#xff0c;然后选出一个最大值。我们平时会在DFS的形参中设置一个变量表示子树的根。但是今天这道题还涉及到…

mysql的事务和锁

【MySQL事务和锁】 学习原文&#xff1a;https://blog.csdn.net/zly03/article/details/127170995 事务四大特性&#xff1a;原子性、一致性、隔离性、持久性&#xff0c;简称ACID MySQL中支持3种不同的存储引擎&#xff1a; MyISAM存储引擎、Memory存储引擎、和InnoDB存储引…

CMake使用外部动态库/静态库和头文件

CMake使用外部动态库/静态库和头文件一、准备工作二、新建一个新的CMake工程三、开始构建四、为target添加共享库五、链接静态库一、准备工作 在博文《使用CMake构建静态库和动态库》中已经介绍了libhello动态库的构建和安装&#xff0c;现在我们看看如何使用这个外部动态库。…

iOS 15.0+ 中 SwiftUI 顶部或底部悬浮功能小面板的极简实现

功能需求 我们有时需要在 App 主视图的顶部或底部固定悬浮放置一个功能视图: 如上图所示,我们将一个列表项目输入小面板按需放在主视图的顶部或底部: 当放置在顶部时,解决了其对导航栏(NavigationView)中 toolbar 内容的遮挡问题;当放置在底部时,考虑到了其对列表最后…

spring boot 实现搜索引擎的设计思想

目录 实现思路 索引模块 预处理 对文档进行分词 搜索模块 实现思路 索引构建模块 搜索模块 数据库模块 索引模块 对于搜索一个东西&#xff0c;我们很自然的能想到遍历去查找。比如我要查找一本书叫 《红楼梦》&#xff0c;那么我直接在所有结果中进行遍历查找&#xff…

druid解析-过滤器详解

druid支持过滤器&#xff0c;可以在获取连接或者调用连接对象的方法时&#xff0c;先调用过滤器&#xff0c;之后再执行底层方法&#xff0c;比如DruidDataSource的getConnection()方法&#xff1a; public DruidPooledConnection getConnection(long maxWaitMillis) throws SQ…

网络安全一哥的奇安信发布了全球高级可持续威胁年度报告 值得学习

声明 本文是学习全球高级持续性威胁 APT 2021年度报告. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 中国境内高级持续性威胁综述 基于中国境内海量DNS域名解析和奇安信威胁情报中心失陷检测&#xff08;IOC&#xff09;库的碰撞分析&…

9_1、Java基本语法之常用类String、StringBuffer、StringBuilder的使用

一、String的使用及常用方法 1、概述 String:表示字符串&#xff0c;使用""引起来。 1.1、String类是声明为final的&#xff0c;不可被继承。 1.2、String类实现了Serializable接口&#xff0c;表示字符串支持序列化。 …

【王道操作系统】2.1.3 原语实现对进程的控制

原语实现对进程的控制 文章目录原语实现对进程的控制1.什么是进程控制2.原语实现对进程的控制3.回忆进程的组织4.进程控制大致图解5.进程控制原语的相同点6.进程控制的五种原语1.什么是进程控制 2.原语实现对进程的控制 3.回忆进程的组织 4.进程控制大致图解 这里说明一下调度和…

MySQL【AUTO_INCREMENT 】自增列

使用案例场景再现&#xff1a; 创建一个为test的数据库&#xff0c;为数据库test创建一个数据表student &#xff0c;其中包含的字段有 id name sex&#xff0c;admission_time,其中要求student表中的人员id必须连续排列。 create database test use test cr…