【Qt】文件

🌈 个人主页:Zfox_
🔥 系列专栏:Qt

目录
- 一:🔥 Qt 文件概述
- 二:🔥 输入输出设备类
- 三:🔥 文件读写类
- 四:🔥 文件和目录信息类
- 五:🔥 其他
- 六:🔥 共勉
一:🔥 Qt 文件概述
🦀 文件操作是应用程序必不可少的部分。Qt 作为⼀个通用开发库,提供了跨平台的文件操作能力。Qt 提供了很多关于⽂件的类,通过这些类能够对文件系统进行操作,如文件读写、文件信息获取、文件制或重命名等
二:🔥 输入输出设备类
在 Qt 中,文件读写的类为 QFile
- QFile 的父类为
QFileDevice
,QFileDevice
提供了文件交互操作的底层功能 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 | 用于 安全保存文件 的类。是使用 OSaveFile 保存文件时,它会先把数据写入一个临时文件,成功提交后才将数据写入最终的文件。如果保存过程中出现错误,临时文件里的数据不会被写入最终文件,这样就能确保最终文件中不会丢失数据或被写入部分数据。在保存比较大的文件或复杂格式的文件时可以使用这个类,例如从网络上下载文件等。 |
QTemporaryFile | 用于 创建临时文件 的类。使用函数 QTemporaryFile::open() 就能创建一个文件名唯一的临时文件,在 QTemporaryFile 对象被删除时,临时文件被自动删除 |
QTcpSocket QUdpSocket | 分别实现了 TCP 和 UDP 的类。 |
OSerialPort | 实现了 串口通信 的类,通过这个类可以实现计算机与串口设备的通信。 |
QBluetoothSocket | 用于 蓝牙通信 的类。手机和平板计算机等移动设备有蓝牙通信模块,笔记本电脑一般也有蓝牙通信模块。通过 QBluetoothSocket 类,就可以编写蓝牙通信程。如编程实现笔记本电脑与手机的蓝牙通信。 |
QProcess | 用于启动外部程序,并且可以给程序传递参数。 相当于是对 fork / exec 操作进行的封装 |
QBuffer | 以一个 QByteArray 对象作为数据缓冲区,将 QByteArray 对象当作一个 I/0 设备来读写。 |
- 串口:一种比较古老的通信方式,一般是在嵌入式系统上,通过串口和开发板之间进行交互操作
三:🔥 文件读写类
在 Qt 中,文件的读写主要是通过 QFile
类来实现。在 QFile
类中提供了一些用来读写文件的方法。对于文件的操作主要有:
- 读数据:QFile 类中提供了多个方法用于读取文件内容;如:read()、readAll()、readLine()等。
- 写数据:QFile 类中提供了多个方法用于往文件中写内容;如 write()、writeData()等。
- 关闭文件:文件使用结束后必须用函数 close()关闭文件。
访问一个设备之前,需要使用 open()
函数 打开该设备,而且必须指定正确的打开模式,QIODevice 中所有的打开模式由 QlODevice::OpenMode
枚举变量定义,其取值如下:
名称 | 说明 |
---|---|
QIODevice::NotOpen | 没有打开设备 |
QIODevice::ReadOnly | 以 只读 方式打开设备 |
QIODevice::WriteOnly | 以 只写 方式打开设备 |
QIODevice::ReadWrite | 以 读写 方式打开设备 |
QIODevice::Append | 以 追加 方式打开设备,数据写到文件末尾 |
QIODevice::Truncate | 每次打开文件后重写文件内容,原内容将被删除 |
QIODevice::Text | 在读文件时,行尾终止符会被转换为 ‘\n’;当写入文件时,行尾终止符会被转换为本地编码。如:Win32上为 ‘\r\n’; |
QIODevice::Unbuffered | 无缓冲形式打开文件,绕过设备中的任何缓冲区 |
QIODevice::NewOnly | 文件存在则打开失败,不存在则创建文件 |
代码示例1:创建和打开文件
#include <QFile>
#include <QTextStream>
#include <QDebug>void createAndWriteFile(const QString &filePath) {QFile file(filePath);if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {QTextStream out(&file);out << "Hello, Qt!\n";file.close();} else {qDebug() << "无法打开文件:" << file.errorString();}
}
代码示例2:读取文件
void readFile(const QString &filePath) {QFile file(filePath);if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {QTextStream in(&file);while (!in.atEnd()) {QString line = in.readLine();qDebug() << line;}file.close();} else {qDebug() << "无法打开文件:" << file.errorString();}
}
代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPlainTextEdit>
#include <QFileDialog>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);this->setWindowTitle("记事本");QMenuBar* menuBar = this->menuBar();// 获取到菜单项QMenu* menu = new QMenu("文件");// 添加菜单menuBar->addMenu(menu);QAction* ac1 = new QAction("打开"); // 添加菜单项QAction* ac2 = new QAction("保存");menu->addAction(ac1);menu->addAction(ac2);// 指定一个输入框 edit 为全局变量edit = new QPlainTextEdit();QFont font;font.setPixelSize(25);edit->setFont(font);this->setCentralWidget(edit);// 连接 QAction 信号槽connect(ac1, &QAction::triggered, this, &MainWindow::handleAction1);connect(ac2, &QAction::triggered, this, &MainWindow::handleAction2);
}void MainWindow::handleAction1()
{// 1. 先弹出 "打开文件" 对话框,选择打开文件QString path = QFileDialog::getOpenFileName(this);// 2. 把文件名显示到状态栏里QStatusBar* statusBar = this->statusBar();statusBar->showMessage(path);// 3. 根据用户选择路径,构造一个 QFile 对象,并且打开文件QFile file(path);if(!file.open(QIODevice::ReadOnly)){// 打开文件失败statusBar->showMessage(path + " 打开失败");return;}// 4. 读取文件// 这里需要确保打开的文件是文本文件才行// 如果是 二进制文件, 交给 QString,QString text = file.readAll();// 5. 关闭文件,并设置读取内容file.close();edit->setPlainText(text);
}void MainWindow::handleAction2()
{// 1. 先弹出 "打开文件" 对话框,选择打开文件QString path = QFileDialog::getOpenFileName(this);// 2. 显示文件名QStatusBar* statusBar = this->statusBar();statusBar->showMessage(path);// 3. 根据用户选择路径,构造一个 QFile 对象,并且打开文件QFile file(path);if(!file.open(QIODevice::WriteOnly)){statusBar->showMessage(path + " 打开失败");return;}// 4. 写文件const QString& text = edit->toPlainText();file.write(text.toUtf8());file.close();
}MainWindow::~MainWindow()
{delete ui;
}
结果如下:
四:🔥 文件和目录信息类
QFilelnfo
是 Qt
提供的一个用于获取文件和目录信息的类,如获取文件名、文件大小、文件修改日期等。QFileInfo
类中提供了很多的方法,常用的有:
方法名称 | 作用 |
---|---|
isDir() | 检查该文件是否是目录 |
isExecutable() | 检查该文件是否是可执行文件 |
fileName() | 获得文件名 |
completeBaseName() | 获取完整的文件名 |
suffix() | 获取文件后缀名 |
completeSuffix() | 获取完整文件后缀 |
size() | 获取文件大小 |
isFile() | 判断是否为文件 |
fileTime() | 获取文件创建时间、修改时间、最近访问时间等 |
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>
#include <QFileDialog>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton* button = new QPushButton("查看文件属性", this);connect(button, &QPushButton::clicked, [=](){QString path = QFileDialog::getOpenFileName(this);QFileInfo fileInfo(path); // 构造对象// 打印相关属性qDebug() << fileInfo.fileName();qDebug() << fileInfo.suffix();qDebug() << fileInfo.path();qDebug() << fileInfo.size();qDebug() << fileInfo.isFile();qDebug() << fileInfo.isDir();// ...});
}
五:🔥 其他
① 创建删除目录
#include <QDir>void createDirectory(const QString &dirPath) {QDir dir;if (!dir.exists(dirPath)) {if (dir.mkpath(dirPath)) {qDebug() << "目录创建成功:" << dirPath;} else {qDebug() << "无法创建目录:" << dir.errorString();}} else {qDebug() << "目录已存在:" << dirPath;}
}void deleteDirectory(const QString &dirPath) {QDir dir(dirPath);if (dir.exists()) {if (dir.rmdir(dirPath)) {qDebug() << "目录删除成功:" << dirPath;} else {qDebug() << "无法删除目录:" << dir.errorString();}} else {qDebug() << "目录不存在:" << dirPath;}
}
② 选择文件
QFileDialog::getOpenFileName() 函数可以用来打开文件选择对话框,让用户选择文件。
#include <QApplication>
#include <QFileDialog>
#include <QPushButton>
#include <QWidget>
#include <QVBoxLayout>
#include <QMessageBox>class FileSelector : public QWidget {
public:FileSelector() {QPushButton *button = new QPushButton("选择文件", this);QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(button);// 点击按钮时打开文件选择器connect(button, &QPushButton::clicked, this, &FileSelector::selectFile);}private slots:void selectFile() {QString fileName = QFileDialog::getOpenFileName(this, tr("打开文件"), "", tr("所有文件 (*.*);;文本文件 (*.txt)"));if (!fileName.isEmpty()) {QMessageBox::information(this, tr("选择的文件"), fileName);}}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);FileSelector window;window.setWindowTitle("文件选择示例");window.resize(300, 100);window.show();return app.exec();
}
说明:
QFileDialog::getOpenFileName():用于打开单个文件选择对话框。
参数解释:
- 第一个参数是父窗口。
- 第二个参数是对话框标题。
- 第三个参数是默认路径。
- 第四个参数是过滤器,用于指定可以选择的文件类型。
③ 选择文件夹
QFileDialog::getExistingDirectory() 用来让用户选择文件夹
#include <QApplication>
#include <QFileDialog>
#include <QPushButton>
#include <QWidget>
#include <QVBoxLayout>
#include <QMessageBox>class FolderSelector : public QWidget {
public:FolderSelector() {QPushButton *button = new QPushButton("选择文件夹", this);QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(button);// 点击按钮时打开文件夹选择器connect(button, &QPushButton::clicked, this, &FolderSelector::selectFolder);}private slots:void selectFolder() {QString folderName = QFileDialog::getExistingDirectory(this, tr("选择文件夹"), "");if (!folderName.isEmpty()) {QMessageBox::information(this, tr("选择的文件夹"), folderName);}}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);FolderSelector window;window.setWindowTitle("文件夹选择示例");window.resize(300, 100);window.show();return app.exec();
}
- 注意:QFileDialog::getExistingDirectory():用于打开选择文件夹的对话框。
④ 选择多个文件
如果你想让用户一次选择多个文件,可以使用
QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("选择多个文件"), "", tr("所有文件 (*.*);;图片文件 (*.png *.jpg)"));if (!fileNames.isEmpty()) {for (const QString &fileName : fileNames) {// 处理每个文件qDebug() << "选择的文件:" << fileName;}
}
上面三个的区别如下:
名称 | 作用 |
---|---|
QFileDialog::getOpenFileName() | 选择单个文件 |
QFileDialog::getExistingDirectory() | 选择文件夹 |
QFileDialog::getOpenFileNames() | 选择多个文件 |
这段代码允许用户同时选择多个文件,返回的是 QStringList,可以遍历进行处理。
⑤ 过滤文件类型
在文件选择对话框中,可以使用过滤器来限制用户选择某些特定类型的文件
QString fileName = QFileDialog::getOpenFileName(this, tr("打开文件"), "", tr("图像文件 (*.png *.jpg);;文本文件 (*.txt);;所有文件 (*.*)"));
六:🔥 共勉
😋 以上就是我对 【Qt】文件
的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉
相关文章:

【Qt】文件
🌈 个人主页:Zfox_ 🔥 系列专栏:Qt 目录 一:🔥 Qt 文件概述 二:🔥 输入输出设备类 三:🔥 文件读写类 四:🔥 文件和目录信息类 五&…...
7.DJI-PSDK:psdk负载应用固件升级(基于RTOS)
DJI-PSDK:psdk负载应用固件升级(基于RTOS): 在单片机应用程序开发阶段,我们可以借助keil5和J-LINK来直接下载应用程序进行开发和调试, 但在产品交付之后,我们对应用程序做了改动和升级,是断然不可能采用这种方式的,我们应该将新版本的程序固件打包发给客户, 能够方便用…...
ArrayUtils:数组操作的“变形金刚“——让你的数组七十二变
各位数组操控师们好!今天给大家带来的是Apache Commons Lang3中的ArrayUtils工具类。这个工具就像数组界的"孙悟空",能让你的数组随心所欲地变大、变小、变长、变短,再也不用对着原生数组的"死板"叹气了! 一…...
架构-系统可靠性分析与设计
一、可靠性相关基本概念 1. 可靠性与可用性 可靠性:软件系统在遇到错误、意外操作或系统故障时,仍能维持自身功能特性的能力。 举例:手机银行APP在用户误操作(如快速点击多次转账)时,仍能正确处理交易并避…...

【AI】[特殊字符]生产规模的向量数据库 Pinecone 使用指南
一、Pinecone 的介绍 Pinecone是一个完全托管的向量数据库服务,专为大规模机器学习应用设计。它允许开发者轻松存储、搜索和管理高维向量数据,为推荐系统、语义搜索、异常检测等应用提供强大的基础设施支持。 1.1 Pinecone的核心特性 1. 高性能向量搜…...
大模型备案对模型训练语料的要求
昨天接到一位客户的咨询,说他们的模型还在开发阶段,想提前了解一下大模型备案政策中对于模型训练语料有什么具体要求,提前规避一下。客户确实有前瞻性,考虑得比较充分。训练语料在研发阶段至关重要,直接影响模型的性能…...

dstream
DStream转换DStream 上的操作与 RDD 的类似,分为 Transformations(转换)和 Output Operations(输出)两种,此外转换操作中还有一些比较特殊的原语,如:updateStateByKey()、transform(…...
CentOS系统中MySQL安装步骤分享
在 CentOS 系统上安装 MySQL,需要依次进行环境检查、软件源配置、安装 MySQL、启动服务等操作。我将按照规范流程,为你详细分享完整且具体的安装步骤。 在 CentOS 系统中安装 MySQL 数据库,能够为各类应用提供高效稳定的数据存储和管理服务。…...

HFSS5(李明洋)——设置激励(波端口激励)
Magnetic是适用于铁磁氧导体的,只有前三种激励类型可以用于计算S参数 1波端口激励 也可以设置在模型内部,如果是设置在模型内部必须加一段理想导体,用于指定端口方向 1.1——模式 number 输入N:计算1-N的模式都计算 1.2——模式…...

ubiquant比赛系列——用docker准备ubipoker开发环境
比赛过程: 环境准备: #在云服务器上拉python官方的docker镜像并下载到本地 https://hub.docker.com/_/python/ sudo docker pull python:3.11.12-slim-bullseye sudo docker images sudo docker save -o 3.11.12-slim-bullseye.tar python:3.11.12-slim…...
运维打铁:Mysql 分区监控以及管理
文章目录 一、简介二、设计逻辑1、配置文件检查2、创建逻辑3、 删除逻辑4、重建表分区逻辑5、recognize maxvalue分区表逻辑6、创建多个未来分区逻辑7、定时检测分区是否创建成功,否则发送告警邮件。 三、解决的问题四、配置例子与介绍 一、简介 操作数据库…...

Rust实现高性能目录扫描工具ll的技术解析
Rust实现高性能目录扫描工具ll的技术解析 一、项目概述 本项目使用Rust构建了一个类ls命令行工具,具备以下核心特性: 多格式文件信息展示并行目录扫描加速人类可读文件大小运行时性能统计交互式进度提示 二、技术架构 1. 关键技术栈 clapÿ…...

深入理解C语言变量:从基础到实践
在编程世界中,变量是最基础也是最重要的概念之一。作为C语言的核心组成部分,变量承载着程序运行时数据的存储和传递功能。理解变量的工作原理和正确使用方法,是成为一名合格C程序员的必经之路。本文将全面介绍C语言变量的各个方面,…...
深入解析 SMB 相关命令:smbmap、smbclient、netexec 等工具的使用指南
Server Message Block(SMB)协议是广泛应用于文件共享、打印机共享和进程间通信的网络协议,尤其在 Windows 环境中常见。渗透测试和网络安全审计中,SMB 是一个重要的攻击面,相关工具如 smbmap、smbclient 和 netexec 提…...

RK3562/3588 系列之0—NPU基础概念
RK3562/3588 系列之0—NPU基础概念 1.处理器分类2.算力衡量指标TOPS参考文献 1.处理器分类 中央处理器(CPU); 图形处理器 (GPU); 神经网络处理器(NPU)。 每个处理器擅长不同的任务:CPU擅长顺序控制和即时性;GPU适合并行数据流处理,NPU擅长…...
springboot如何管理多数据源?
静态多数据源管理 配置多个数据源 :创建多个数据源的配置类,通常使用 @ConfigurationProperties 注解来绑定配置文件中的数据源属性,并通过 @Bean 注解定义多个 DataSource Bean 。例如: 配置类: @Configuration public class DataSourceConfig {@Bean(name = "prima…...
为什么vue的key值,不用index?
在 Vue 中,key 的作用是帮助框架高效地识别和复用 DOM 节点或组件实例。使用数组索引 (index) 作为 key 值可能会导致以下问题,因此通常不建议这样做: 1. 列表数据变化时,可能导致错误的 DOM 复用 问题:当列表的顺序…...

canvas画板!随意画!!
希望你天天开心 代码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>绘画板</title…...

Float32、Float16、BFloat16
我们先介绍 Float32、Float16、BFloat16 的 浮点数表示方法 然后根据浮点数表示,来分析总结他们是怎么控制 精度和 数值范围 的 最后再来对比的说明 Float32、Float16、BFloat16 的 应用场景 和 硬件支持 1、浮点数的表示方法 Float32 : 单精度浮点数…...
C# new Bitmap(32043, 32043, PixelFormat.Format32bppArgb)报错:参数无效,如何将图像分块化处理?
C#处理非常大的图像(如 32043x32043 像素)时,确实需要采取分块化处理的方法来避免内存不足的问题。分块化处理可以将大图像分割成多个较小的块,分别进行处理和保存,最后再合并这些块以形成完整的图像。以下是一个详细的…...

5V 1A充电标准的由来与技术演进——从USB诞生到智能手机时代的电力革命
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 一、起源:USB标准与早期电力传输需求 1. USB的诞生背景 1996年,由英特尔、微软、IBM等公司组成的USB-IF(USB Implementers Forum)发布了…...

微信小程序蓝牙连接打印机打印单据完整Demo【蓝牙小票打印】
文章目录 一、准备工作1. 硬件准备2. 开发环境 二、小程序配置1. 修改app.json 三、完整代码实现1. pages/index/index.wxml2. pages/index/index.wxss3. pages/index/index.js 四、ESC/POS指令说明五、测试流程六、常见问题解决七、进一步优化建议 下面我将提供一个完整的微信…...

龙虎榜——20250425
指数依然在震荡,等待方向选择,整体量能不搞但个股红多绿少。 2025年4月25日龙虎榜行业方向分析 一、核心主线方向 绿色电力(政策驱动业绩弹性) • 代表标的:华银电力(绿电运营)、西昌电力&…...

计算机组成原理:指令系统
计算机组成原理:指令集系统 指令集体系结构(ISA)ISA定义ISA包含的内容举个栗子指令的基本组成(操作码+地址码)指令分类:地址码的个数定长操作码变长操作码变长操作码的原则变长操作码的设计指令寻址寻址方式的目的寻址方式分类有效地址直接在指令中给出有效地址间接给出有效地…...

【Go语言】RPC 使用指南(初学者版)
RPC(Remote Procedure Call,远程过程调用)是一种计算机通信协议,允许程序调用另一台计算机上的子程序,就像调用本地程序一样。Go 语言内置了 RPC 支持,下面我会详细介绍如何使用。 一、基本概念 在 Go 中&…...

Python----深度学习(基于深度学习Pytroch簇分类,圆环分类,月牙分类)
一、引言 深度学习的重要性 深度学习是一种通过模拟人脑神经元结构来进行数据学习和模式识别的技术,在分类任务中展现出强大的能力。 分类任务的多样性 分类任务涵盖了各种场景,例如簇分类、圆环分类和月牙分类,每种任务都有不同的…...
入侵检测系统(IDS)与入侵防御系统(IPS):功能对比与部署实践
入侵检测系统(IDS)与入侵防御系统(IPS):功能对比与部署实践 在网络安全防御体系中,入侵检测系统(Intrusion Detection System, IDS)与入侵防御系统(Intrusion Preventio…...

uniapp-商城-38-shop 购物车 选好了 进行订单确认4 配送方式1
配送方式在订单确认页面最上方,可以进行选中配送还是自提,这里先看看配送。 代码样式: 可以看出来是通过组件来实现的。组件名字是:delivery-layout 1、建立组件文件夹和页面,delivery-layout这里就只有配送 2、具体…...

uniappx 打包配置32位64位x86安装包
{"app": {"distribute": {"android": {"abiFilters": ["armeabi-v7a","arm64-v8a","x86","x86_64"]}}} }...

【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)
Inverse Reinforcement Learning (IRL) 详解 什么是 Inverse Reinforcement Learning? 在传统的强化学习 (Reinforcement Learning, RL) 中,奖励函数是已知的,智能体的任务是学习一个策略来最大化奖励 而在逆向强化学习 (Inverse Reinforc…...