Qt 文件操作

news2024/10/6 5:59:15

文件概述

文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。Qt 提供了很多关于文件的类,通过这些类能够对文件系统进行操作,如文件读写、文件信息获取、文件复制或重命名等。

输入输出设备类

在 Qt 中,文件读写的类为 QFile。QFile 的父类为 QFileDevice,OFileDevice 提供了文件交互操作的底层功能。 QFileDevice 的父类是 QIODevice,QIODevice 的父类为 QObject。

QIODevice 是 Qt 中所有输入输出设备 (input/output device,简称I/O 设备)的基础类,I/O 设备就是能进行数据输入和输出的设备,例如文件是一种 I/O 设备,网络通信中的 socket 是 I/O 设备,串口、蓝牙等通信接口也是 I/O 设备,所以它们也是从 QIODevice 继承来的。Qt 中主要的一些 I/O 设备类的继承关系如下图所示:

在这里插入图片描述

上图中各类的说明如下:

  • QFile 是用于文件操作和文件数据读写的类,使用 QFile 可以读写任意格式的文件
  • QSaveFile 是用于安全保存文件的类。使用 QSaveFile 保存文件时,它会先把数据写入一个临时文件,成功提交后才将数据写入最终的文件。如果保存过程中出现错误,临时文件里的数据不会被写入最终文件,这样就能确保最终文件中不会丢失数据或被写入部分数据。 在保存比较大的文件或复杂格式的文件时可以使用这个类,例如从网络上下载文件等。
  • QTemporaryFile 是用于创建临时文件的类。使用函数 (QTemporaryFile:open) 就能创建一个文件名唯一的临时文件,在 QTemporaryFile 对象被删除时,临时文件被自动删除。
  • QTcpSocket 和 QUdpSocket 是分别实现了 TCP 和 UDP 的类
  • QSerialPort 是实现了串口通信的类,通过这个类可以实现计算机与串口设备的通信。
  • QBluetoothSocket 是用于蓝牙通信的类。手机和平板计算机等移动设备有蓝牙通信模块,笔记本电脑一般也有蓝牙通信模块。通过 QBluetoothSocket 类,就可以编写蓝牙通信程。如编程实现笔记本电脑与手机的蓝牙通信
  • QProcess 类用于启动外部程序,并且可以给程序传递参数。
  • QBuffer 以一个 QByteArray 对象作为数据缓冲区,将 ByteArray 对象当作一个 I/O 设备来读写。

文件读写类

在 Qt 中,文件的读写主要是通过 QFile 类来实现。在QFile 类中提供了一些用来读写文件的方法。对于文件的操作主要有:

  • 读数据:QFile 类中提供了多个方法用于读取文件内容;如 read()、readAll()、readLine()等
  • 写数据:QFile 类中提供了多个方法用于往文件中写内容;如 write()、writeData()等。
  • 关闭文件:文件使用结束后必须用函数 close() 关闭文件。

访问一个设备之前,需要使用 open() 函数打开该设备,而且必须指定正确的打开模式,QIODevice 中所有的打开模式由 QIODevice::OpenMode 枚举变量定义,其取值如下:

在这里插入图片描述

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

示例1:读取文件内容

1、新建 Qt 项目,在 UI 文件中拖入一个 LineEdit,一个 pushButton,一个 TextEdit。当点击按钮时,弹出窗口选择要读取的文件,并将读取到的内容在 TextEdit 中显示;

在这里插入图片描述

2、在 widget.cpp 文件中实现对应功能

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>

Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
	ui->setupUi(this);
	connect(ui->btn,&QPushButton::clicked,[=](){
	QString path = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\Lenovo\\Desktop");
	ui->lineEdit->setText(path);
	QFile file(path); //path:代表⽂件路径
	//打开⽂件
	file.open(QIODevice::ReadOnly); //以只读的⽅式打开⽂件
	QString str = file.readAll();
	ui->textEdit->setText(str);
	//关闭⽂件
	file.close();
    });
}

效果如下

在这里插入图片描述

示例2:写文件

在上述示例的基础上修改 “widget.cpp" 文件;

Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
	ui->setupUi(this);
	connect(ui->btn,&QPushButton::clicked,[=](){
	QString path = QFileDialog::getOpenFileName(this,"打开⽂件","C:\\Users\\Lenovo\\Desktop");
	ui->lineEdit->setText(path);
	QFile file(path); //path:代表⽂件路径
	//打开⽂件 进⾏写操作
	file.open(QIODevice::Append); //以追加的⽅式进⾏写
	file.write("【这是⽰例!!!】");
	//关闭⽂件
	file.close();
	});
}

效果如下:

在这里插入图片描述

文件和目录信息类

QFilelnfo 是 Qt 提供的一个用于获取文件和目录信息的类,如获取文件名、文件大小、文件修改日期等。QFilelnfo 类中提供了很多的方法,常用的有:

  • isDir() 检查该文件是否是目录;
  • isExecutable() 检查该文件是否是可执行文件;
  • fileName() 获得文件名;
  • completeBaseName() 获取完整的文件名:
  • suffix() 获取文件后缀名
  • completeSuffix() 获取完整的文件后缀:
  • size() 获取文件大小;
  • isFile() 判断是否为文件;
  • fileTime() 获取文件创建时间、修改时间、最近访问时间等

示例

#include <QFileInfo>
#include <QFileDialog>
#include <QDebug>
#include <QDateTime>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
	ui->setupUi(this);
	connect(ui->btn,&QPushButton::clicked,[=](){
	QString path = QFileDialog::getOpenFileName(this,"打开⽂件","C:\\Users\\Lenovo\\Desktop");
	//QFileInfo ⽂件信息类
	QFileInfo fileinfo(path);
	//⽂件名
	qDebug() << "⽂件名为:" << fileinfo.fileName().toUtf8().data();
	//⽂件后缀名
	qDebug() << "后缀名为:" << fileinfo.suffix().toUtf8().data();
	//⽂件⼤⼩
	qDebug() << "⽂件⼤⼩为:" << fileinfo.size();
	//⽂件路径
	qDebug() << "⽂件路径为:" << fileinfo.path().toUtf8().data();
	//判断是否为⽂件
	qDebug() << "是否为⽂件:"<< fileinfo.isFile();
	//⽂件创建时间
	QDateTime time1 = fileinfo.fileTime(QFileDevice::FileBirthTime);
	qDebug() << "创建时间为:" << time1.toString("yyyy-MM-ddhh:mm:ss").toUtf8().data();
	//⽂件的最后修改⽇期
	QDateTime time2 = fileinfo.lastModified();
	qDebug() << "最后修改时间为:"<< time2.toString("yyyy-MM-ddhh:mm:ss").toUtf8().data();
	//判断是否为⽂件夹
	qDebug() << "是否为⽬录:" << fileinfo.isDir();
	});
}

效果如下:

在这里插入图片描述

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

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

相关文章

iOS_convert point or rect 坐标和布局转换+判断

文章目录 1. 坐标转换2. 布局转换3. 包含、相交 如&#xff1a;有3个色块 let view1 UIView(frame: CGRect(x: 100.0, y: 100.0, width: 300.0, height: 300.0)) view1.backgroundColor UIColor.cyan self.view.addSubview(view1)let view2 UIView(frame: CGRect(x: 50.0, …

什么是V R美术馆|V R互动体验店加盟|虚拟现实元宇宙

VR美术馆是利用虚拟现实&#xff08;VR&#xff09;技术构建的数字化美术馆&#xff0c;通过虚拟展厅和虚拟展览等形式展示艺术作品、举办艺术展览&#xff0c;为用户提供一种沉浸式的艺术体验。用户可以通过穿戴VR头显等设备&#xff0c;在虚拟环境中自由浏览各种艺术作品&…

Python环境下一种新的类谱峭度算法的旋转机械故障诊断模型

谱峭度SK的本质是计算每根谱线峭度值的高阶统计量&#xff0c;谱峭度对信号中的瞬态冲击成分十分敏感&#xff0c;能有效的从含有背景噪声信号中识别瞬态冲击及其在频带中的分布。由于谱峭度的复杂性、缺少一个正式的定义和一个容易理解的计算过程使其在很长时间内都未能引入到…

Vue3进阶(叁):关于 Vue2 项目迁移至 Vue3 的几点注意事项

文章目录 一、前言二、Vue3 新特性三、Vue2 安全保障四、迁移方案4.1 迁移辅助工具 vue/compat 库 五、迁移注意事项5.1 升级和兼容性5.2 组件的改变5.3 Composition API5.4 Vue Router5.5 Vuex5.6 其他库和插件5.7 差异示例5.7.1 创建vue5.7.2 定义时间格式全局过滤器5.7.3 vu…

修复ubuntu引导

一、制作ubuntu启动U盘 进入启动盘后&#xff0c;点击Try ubuntu&#xff0c;进入U盘的ubuntu系统。 二、配置和添加源 sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update三、运行 Boot Repair重新制作引导 sudo boot-repair注意&#x…

QT 控件有突出感,定义控件边框

QT 控件有突出感&#xff0c;定义控件边框 1.设计师页面 在flat部分选中 这个时候按钮会失去边框如下图&#xff1a; 然后在.cpp文件中写入代码&#xff1a; ui->pushButton->setStyleSheet("border: 1px solid gray;");按钮就有了新的边框&#xff1a;

hdlbits系列verilog解答(Hadd)-65

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本节我们创建一个半加法器。半加法器将两个位相加(无进位)并产生求和和进出。 模块声明 module top_module( input a, b, output cout, sum ); 思路: 可用真值表写出逻辑表达式,或者直接用数据流方式。 二…

VMware和Xshell连接

1.开启虚拟机 2.使用管理员账户&#xff0c;点击未列出 3.输入用户名密码 4.点击编辑虚拟网络编辑器 5.记住自己的网关和IP地址 6.打开终端 7.输入命令&#xff0c;vim / etc / sysconfig / network -scripts / ifcfg-ens33 回车 8.修改图中两处按“ I ”键进入编辑 d…

【网安小白成长之路】2.PHP与MySQL交互

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f51e; 《网安小白成长之路(我要变成大佬&#x1f60e;&#xff01;&#xff01;)》真实小白学习历程&#xff0c;手把手带你一起从入门到入狱&#x1f6ad; &…

Jenkins--在Linux上使用Docker安装

一、Jenkins 简介 Jenkins是一个流行的开源自动化服务器&#xff0c;用于持续集成和持续交付&#xff08;CI/CD&#xff09;。Jenkins的核心功能主要包括以下几点&#xff1a; 持续集成&#xff1a;Jenkins可以监控版本控制系统&#xff08;如Git、SVN&#xff09;中的代码变…

Django开发复盘

一、URL 对于一个不会写正则表达式的蒟蒻来说&#xff0c;在urls.py中就只能傻傻的写死名字&#xff0c;但是即便这样&#xff0c;还会有很多相对路径和绝对路径的问题&#xff08;相对ip端口的路径&#xff09;&#xff0c;因为我们网页中涉及到页面跳转&#xff0c;涉及到发送…

【LaTeX】7实现章节跳转

使用 LaTeX 实现章节跳转 写在最前面1. 引入 hyperref 包2. 标记章节3. 引用章节示例代码注意 小技巧总结 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;…

江协STM32:点亮第一个LED灯和流水灯

很多单片机都是高电平弱驱动&#xff0c;低电平强驱动&#xff0c;所以这里是低电平有效 点亮一个LED灯 操作STM32的GPIO需要三个操作&#xff1a; 第一个使用RCC开启GPIO的时钟 第二步使用GPIO_Init函数初始化GPIO 第三步使用输出或输入函数控制GPIO 1.使用RCC开启GPIO的时…

使用patchelf解决vscode远程连接不支持低版本glibc的问题

使用patchelf解决vscode远程连接不支持低版本glibc的问题 目录 使用patchelf解决vscode远程连接不支持低版本glibc的问题1. 动态链接库下载2. 用 patchelf 修改 vscode-server 依赖的 glibc 版本 VScode 1.86 版本的 remote 要求 glibc 2.28 及以上&#xff0c;于是在各种旧版本…

python--函数的参数问题

1.函数的参数&#xff1a; 默认值参数&#xff1a;通过定义函数时&#xff0c;将可能调用时不怎么变化的参数&#xff0c;给定默认值&#xff0c;在调用时方便调用 注意&#xff1a;位置参数不能写在默认值参数后边 可变参数&#xff08;不定长参数&#xff09;&#xff1a;在开…

阿里云云服务器资源规格推荐指南

资源规格推荐可以根据您的特定业务场景&#xff0c;为您推荐最合适的计算资源规格以及满足您算力需求的资源规模。本文介绍如何根据物理机规格推荐ECS资源和根据总算力推荐ECS资源。 根据物理机规格推荐ECS资源 IDC上云可以帮助您在将线下IDC服务器搬迁上云前&#xff0c;根据…

《深入Linux内核架构》第3章 内存管理(4)

目录 3.4 初始化内存管理 3.4.1 建立数据结构 3.4.2 特定于体系架构的设置 内核在内存中的布局 初始化步骤 分页机制的初始化 3.4.3 启动期间的内存管理 数据结构 初始化 与内核的接口 停用bootmem分配器 释放初始化数据 3.4 初始化内存管理 包括&#xff1a; 显式…

【数字图像处理matlab系列】数组索引

【数字图像处理matlab系列】数组索引 【先赞后看养成习惯】【求点赞+关注+收藏】 MATLAB 支持大量功能强大的索引方案,这些索引方案不仅简化了数组操作,而且提高了程序的运行效率。 1. 向量索引 维数为1xN的数组称为行向量。行向量中元素的存取是使用一维索引进行的。因此…

STM32收发HEX数据包

在实际应用中&#xff0c;STM32的串口通信都是以数据包格式进行收发&#xff0c;这个数据包一般都包含包头和包尾&#xff0c;表示一个数据包。源代码在文末给出 数据包格式&#xff1a; 固定长度&#xff0c;含包头包尾 可变包长&#xff0c;含包头包尾 问题1&#xff1a;当…

Anaconda虚拟环境的介绍与使用

Anaconda虚拟环境介绍 虚拟环境是一种工具&#xff0c;可以让您在同一台计算机上创建多个独立的Python环境&#xff0c;每个环境可以拥有自己的Python解释器版本、包和依赖项。使用虚拟环境有以下几个优点&#xff1a; 隔离项目环境&#xff1a; 在开发中&#xff0c;不同的项…