Qt_文件操作

news/2024/9/29 3:22:38/

目录

1、输入输出类 

2、QFile介绍

3、QFile测试

4、QFileInfo介绍 

5、QFileInfo测试

结语


前言:

        文件操作是程序中的一个重要概念,数据的存储和读取都离不开文件操作。Qt具有强大的跨平台性,因此他提供了跨平台的文件操作能力。Qt中将文件抽象成类,通过这些类可以对文件进行相关操作,如:文件打开/关闭、文件IO、文件信息获取等。

1、输入输出类 

        在程序中涉及到输入输出的场景有多种,比如:文件IO,网络通信socket的IO,串口IO,蓝牙IO等,这些IO的用法各不相同,但是他们都有一个共同的概念,即输入输出。因此Qt将输入输出(IO)这一动作封装成一个类,将上述场景封装成一个类并继承输入输出类,这样就能实现底层输入输出是一样的,但是上层的具体功能由不同的派生类决定。

        就拿文件类QFile来举例,QFile的父类是QFileDevice(QFileDevice提供的是文件操作的底层功能),而QFileDevice的⽗类是QIODevice,QIODevice的父类为QObject 。其中QIODevice类就是Qt对输入输出的一个封装,上述继承关系示意图如下:

2、QFile介绍

         在Qt中,文件的读写是通过QFile类来实现,用文件的路径来构造一个QFile对象,此时该对象就是磁盘文件在程序中的“代办人”,因此QFile类提供了⼀些用于读写文件的接口,如下:

• 读数据:QFile 类中提供的方法有:如 read()、readAll()、readLine()等。

• 写数据:QFile 类中提供的方法有:如 write()、writeData()等。

• 打开文件:创建QFile对象后,需要调用QFile提供的open函数来打开对应的文件。

• 关闭文件:文件使用结束后必须调用函数close()关闭文件。

        其中对于open函数的打开方式,QIODevice提供了如下枚举: 

QIODevice::NotOpen
没有打开
QIODevice::ReadOnly 
以只读⽅式打开
QIODevice::WriteOnly
以只写⽅式打开
QIODevice::ReadWrite
以读写⽅式打开
QIODevice::Append
以追加⽅式打开,数据将写到⽂件末尾
QIODevice::Truncate
每次打开⽂件后重写⽂件内容,原内容将被删除
QIODevice::Text
在读⽂件时,⾏尾终⽌符会被转换为 '\n';当写⼊⽂件时,⾏尾终⽌符会被转换为本地编码。如 Win32上为'\r\n'
QIODevice::Unbuffered
⽆缓冲形式打开⽂件,绕过设备中的任何缓冲区
QIODevice::NewOnly
⽂件存在则打开失败,不存在则创建⽂件

3、QFile测试

        新建Qt项目,在UI文件中拖入⼀个LineEdit,⼀个pushButton,⼀个TextEdit。当点击按钮 时,弹出窗口选择要读取的文件,将选取文件的内容显示在TextEdit中,并将该文件的路径显示在LineEdit中,界面设计如下:

        代码如下: 

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{QString path = QFileDialog::getOpenFileName();//获取文件路径ui->lineEdit->setText(path);//将路径设置到输入框中QFile f(path);//用路径构造一个QFile对象f.open(QIODevice::ReadOnly);//只读方式打开该文件QString text = f.readAll();//将文件内容读到缓冲区内ui->textEdit->setText(text);//将缓冲区内数据写到多行输入框中f.close();
}

        运行结果:


        上述是从文件中读取内容显示到TextEdit,还可以将TextEdit中的内容保存到文件中,代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{QString path = QFileDialog::getSaveFileName();//获取文件路径ui->lineEdit->setText(path);//将路径设置到输入框中QFile f(path);//用路径构造一个QFile对象f.open(QIODevice::WriteOnly);//以只写的方式打开文件QString text = ui->textEdit->toPlainText();//将textEdit内容写入缓冲区f.write(text.toStdString().c_str());//将缓冲区的内容写入文件f.close();}

        运行结果:

4、QFileInfo介绍 

        QFileInfo是Qt提供的⼀个用于获取文件和目录信息的类,如获取文件名、文件大小、文件修改日期等基本信息。QFileInfo中提供了获取文件信息的方法,如下:

• isDir() 检查该文件是否为目录;

• isExecutable() 检查该文件是否是可执行文件;

• fileName() 获取完整的文件名(文件名+后缀);

• completeBaseName() 获得文件名;

• suffix() 获取文件后缀名;

• completeSuffix() 获取完整的文件后缀;

• size() 获取文件大小;

• isFile() 判断是否为文件;

• fileTime() 获取文件创建时间;

        和QFile不一样的是,QFileInfo通过文件路径实例化的对象不需要调用open函数打开,因为该对象里保存的只是文件信息的拷贝,因此直接调用对应信息的方法即可。

5、QFileInfo测试

         新建Qt项目,在UI文件中拖入⼀个LineEdit,⼀个pushButton,⼀个TextEdit。测试逻辑和上述例子差不多,当点击按钮时,弹出窗口选择要读取的文件,将选取文件的信息显示在TextEdit中,并将该文件的路径显示在LineEdit中,界面设计如下:

        测试代码如下: 

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QDebug>
#include <QDateTime>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{QString path = QFileDialog::getOpenFileName();//获取文件的路径ui->lineEdit->setText(path);//将路径写入输入框QFileInfo finfo(path);//用路径构造QFileInfo对象QString text;text+="该文件是否为目录:"+ QString::number(finfo.isDir())+"\n";text+="该文件是否是可执行文件:"+QString::number(finfo.isExecutable())+"\n";text+="文件名:"+finfo.completeBaseName()+"\n";text+="完整的文件名:"+finfo.fileName()+"\n";text+="文件后缀名:"+finfo.suffix()+"\n";text+="文件大小:"+QString::number(finfo.size())+"\n";text+="是否为文件:"+QString::number(finfo.isFile())+"\n";QDateTime time = finfo.fileTime(QFileDevice::FileBirthTime);text+="文件创建事件:" + time.toString("yyyy-MM-dd hh:mm:ss");ui->textEdit->setText(text);
}

        运行结果:

结语

        以上就是关于Qt文件操作的讲解,Qt实际上就是将文件封装成了一个类,将文件的操作封装成该类的成员函数,其中还涉及到继承的思想。

        最后如果本文有遗漏或者有误的地方欢迎大家在评论区补充,谢谢大家!!  


http://www.ppmy.cn/news/1530881.html

相关文章

资深专家-教授优青团队亲自指导!从实验设计到论文发表,一站式基因功能分析解决方案!

生物信息实验室致力于分子育种技术的研发和在生物医学研究领域的应用&#xff0c;实验室以分子遗传学实验技术和高通量生物信息分析技术为核心&#xff0c;建立了基因组、表观组、互作组的全面科研服务体系。50余位教授、研究员智库专家&#xff0c;您身边的分子实验专家!

Maven-五、属性

Maven 文章目录 Maven前言属性定义properties文件加载pom文件属性总结 前言 使用maven中的属性可以来简化我们的配置工作。 属性定义 在pom文件中可以使用**标签设置属性&#xff0c;属性名自定义,然后可以在使用${属性名}**文件中引用自己定义的属性。 使用属性进行配置&a…

pytorch 同步机制

pytorch 同步机制 在 PyTorch 中&#xff0c;当多个算子&#xff08;operators&#xff09;和内核&#xff08;kernels&#xff09;被并行执行时&#xff0c;PyTorch 通过 CUDA 的 流&#xff08;streams&#xff09; 和 事件&#xff08;events&#xff09; 机制来管理并发和…

根据源码解析Vue2中对于对象的变化侦测

UI render(state) VUE的特点是数据驱动视图&#xff0c;在这里可以把数据理解为状态&#xff0c;而视图就是用户可以看到的页面&#xff0c;页面是动态变化的&#xff0c;而他的变化或是用户操作引起&#xff0c;或是后端数据变化引起&#xff0c;这些都可以说是数据的状态变…

DC00015基于java web校园网上购物系统

1、项目功能演示 DC00015【含配套文档】基于java web校园网上购物系统 2、项目功能描述 基于java web校园网上购物系统分为用户和系统管理员两个角色。 2.1 用户功能 1、系统登录、用户注册、忘记密码 2、商品浏览、商品详情 3、购物车、付款 4、我的订单 5、修改密码、个人信…

vue3中echarts柱状图横轴文字太多放不下怎么解决

问题&#xff1a;在做数据展示的时候&#xff0c;使用的是echarts&#xff0c;遇到了个问题&#xff0c;就是数据过多&#xff0c;但是设置的x轴的文字名称又太长&#xff0c;往往左边第一个或右边最后一个的名称展示不全&#xff0c;只有半个。 从网上找到了几种办法&#xff…

openmv与stm32通信

控制小车视觉循迹使用 OpenMV 往往是不够的。一般使用 OpenMV 对图像进行处理&#xff0c;将处理过后的数据使用串口发送给STM32&#xff0c;使用STM32控制小车行驶。本文主要讲解 OpenMV 模块与 STM32 间的串口通信以及两种循迹方案&#xff0c;分别是划分检测区域和线性回归。…

SpringBoot整合邮件功能(带附件)

前言 这篇文章只是记录一下在开发中使用邮箱功能 本人在项目中需要使用邮箱发送带附件的邮件&#xff0c;我们的附件可能是在线的阿里云OSS,也可能是系统生成的Excel&#xff0c;写了一个工具类&#xff0c;方便使用。 整合流程 QQ邮箱作为案例 1、添加依赖 <dependency&g…