当前位置: 首页 > news >正文

【Qt】文件

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

目录

  • 一:🔥 Qt 文件概述
  • 二:🔥 输入输出设备类
  • 三:🔥 文件读写类
  • 四:🔥 文件和目录信息类
  • 五:🔥 其他
  • 六:🔥 共勉

一:🔥 Qt 文件概述

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

二:🔥 输入输出设备类

在 Qt 中,文件读写的类为 QFile

  • QFile 的父类为 QFileDeviceQFileDevice 提供了文件交互操作的底层功能
  • QFileDevice 的父类是 QIODeviceQIODevice 的父类为 QObject
  • QIODevice 是 Qt 中所有输入输出设备(input/output device,简称 I/O 设备)的基础类,I/O 设备就是能进行数据输入和输出的设备
  • 例如文件是⼀种 I/O 设备,网络通信中的 socket 是 I/O 设备,串口、蓝牙等通信接口也是 I/O 设备,所以它们也是从 QIODevice 继承来的。

Qt 中主要的⼀些 I/O 设备类的继承关系如下图所示:

image-20250130174219437

名称作用
QFile用于 文件操作和文件数据读写 的类,使用 QFile 可以读写任意格式的文件。
QSaveFile用于 安全保存文件 的类。是使用 OSaveFile 保存文件时,它会先把数据写入一个临时文件,成功提交后才将数据写入最终的文件。如果保存过程中出现错误,临时文件里的数据不会被写入最终文件,这样就能确保最终文件中不会丢失数据或被写入部分数据。在保存比较大的文件或复杂格式的文件时可以使用这个类,例如从网络上下载文件等。
QTemporaryFile用于 创建临时文件 的类。使用函数 QTemporaryFile::open() 就能创建一个文件名唯一的临时文件,在 QTemporaryFile 对象被删除时,临时文件被自动删除
QTcpSocket
QUdpSocket
分别实现了 TCPUDP 的类。
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 枚举变量定义,其取值如下:

image-20250131143636887

名称说明
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;
}

结果如下:

四:🔥 文件和目录信息类

QFilelnfoQt 提供的一个用于获取文件和目录信息的类,如获取文件名、文件大小、文件修改日期等。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】文件 的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉
在这里插入图片描述

相关文章:

  • 2025上海车展:赛轮思AI携手行业领军企业展示xUI——混合式、智能体化的AI助理平台
  • 漏洞管理体系:从扫描评估到修复验证的全生命周期实践
  • RocketMQ 主题与队列的协同作用解析(既然队列存储在不同的集群中,那要主题有什么用呢?)---管理命令、配置安装
  • Spring知识点总结
  • Vue3文件上传组件实战:打造高效的Element Plus上传解决方案,可以对文件进行删除,查看,下载功能。
  • 【HTTP/2:信息高速公路的革命】
  • C++中的vector和list的区别与适用场景
  • 西门子触摸屏文本显示不全,传送字体文件到屏幕的具体操作方法
  • C++ 日志系统实战第三步:熟悉掌握各种设计模式
  • 信令与流程分析
  • 界面控件DevExpress WinForms v25.1 - 数据处理功能持续增强
  • freecad参数化三维模型装配体解析至web端,切换参数组或修改参数
  • Parasoft C++Test软件单元测试_对函数打桩的详细介绍
  • Java对接企业微信实战笔记
  • SQL注入高级绕过手法汇总 重点
  • 在java程序中,类,进程,线程他们之间的关系以及main方法与他们之间的关系
  • 找出字符串中第一个匹配项的下标
  • Xmind快捷键大全
  • 区块链驱动的供应链金融创新:模型构建与商业化路径研究
  • 身份与访问管理(IAM):零信任架构下的认证授权技术与实战
  • 讲座|现代女性在面对生育、事业与家庭之间的复杂抉择
  • 外卖价格、速度哪家强?记者实测美团、饿了么、京东三大平台
  • 偷拍拷贝某轨道车技术信息后撰写论文发表,工程师被判一年有期徒刑
  • 居民被脱落的外墙瓦砖砸中致十级伤残,小区物业赔付16万元
  • 公安部知识产权犯罪侦查局:侦破盗录传播春节档院线电影刑案25起
  • 中央空管办组织加强无人机“黑飞”“扰航”查处力度