【Qt】文件

[复制链接]
发表于 2025-9-21 23:13:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
🌈 个人主页:Zfox_
🔥 系列专栏: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:pen() 就能创建一个文件名唯一的暂时文件,在 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:创建和打开文件
  1. #include <QFile>
  2. #include <QTextStream>
  3. #include <QDebug>
  4. void createAndWriteFile(const QString &filePath) {
  5.     QFile file(filePath);
  6.     if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
  7.         QTextStream out(&file);
  8.         out << "Hello, Qt!\n";
  9.         file.close();
  10.     } else {
  11.         qDebug() << "无法打开文件:" << file.errorString();
  12.     }
  13. }
复制代码
代码示例2:读取文件
  1. void readFile(const QString &filePath) {
  2.     QFile file(filePath);
  3.     if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
  4.         QTextStream in(&file);
  5.         while (!in.atEnd()) {
  6.             QString line = in.readLine();
  7.             qDebug() << line;
  8.         }
  9.         file.close();
  10.     } else {
  11.         qDebug() << "无法打开文件:" << file.errorString();
  12.     }
  13. }
复制代码
代码如下:
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QPlainTextEdit>
  4. #include <QFileDialog>
  5. MainWindow::MainWindow(QWidget *parent)
  6.     : QMainWindow(parent)
  7.     , ui(new Ui::MainWindow)
  8. {
  9.     ui->setupUi(this);
  10.     this->setWindowTitle("记事本");
  11.     QMenuBar* menuBar = this->menuBar();// 获取到菜单项
  12.     QMenu* menu = new QMenu("文件");// 添加菜单
  13.     menuBar->addMenu(menu);
  14.     QAction* ac1 = new QAction("打开"); // 添加菜单项
  15.     QAction* ac2 = new QAction("保存");
  16.     menu->addAction(ac1);
  17.     menu->addAction(ac2);
  18.     // 指定一个输入框 edit 为全局变量
  19.     edit = new QPlainTextEdit();
  20.     QFont font;
  21.     font.setPixelSize(25);
  22.     edit->setFont(font);
  23.     this->setCentralWidget(edit);
  24.     // 连接 QAction 信号槽
  25.     connect(ac1, &QAction::triggered, this, &MainWindow::handleAction1);
  26.     connect(ac2, &QAction::triggered, this, &MainWindow::handleAction2);
  27. }
  28. void MainWindow::handleAction1()
  29. {
  30.     // 1. 先弹出 "打开文件" 对话框,选择打开文件
  31.     QString path = QFileDialog::getOpenFileName(this);
  32.     // 2. 把文件名显示到状态栏里
  33.     QStatusBar* statusBar = this->statusBar();
  34.     statusBar->showMessage(path);
  35.     // 3. 根据用户选择路径,构造一个 QFile 对象,并且打开文件
  36.     QFile file(path);
  37.     if(!file.open(QIODevice::ReadOnly)){
  38.         // 打开文件失败
  39.         statusBar->showMessage(path + " 打开失败");
  40.         return;
  41.     }
  42.     // 4. 读取文件
  43.     // 这里需要确保打开的文件是文本文件才行
  44.     // 如果是 二进制文件, 交给 QString,
  45.     QString text = file.readAll();
  46.     // 5. 关闭文件,并设置读取内容
  47.     file.close();
  48.     edit->setPlainText(text);
  49. }
  50. void MainWindow::handleAction2()
  51. {
  52.     // 1. 先弹出 "打开文件" 对话框,选择打开文件
  53.     QString path = QFileDialog::getOpenFileName(this);
  54.     // 2. 显示文件名
  55.     QStatusBar* statusBar = this->statusBar();
  56.     statusBar->showMessage(path);
  57.     // 3. 根据用户选择路径,构造一个 QFile 对象,并且打开文件
  58.     QFile file(path);
  59.     if(!file.open(QIODevice::WriteOnly)){
  60.         statusBar->showMessage(path + " 打开失败");
  61.         return;
  62.     }
  63.     // 4. 写文件
  64.     const QString& text = edit->toPlainText();
  65.     file.write(text.toUtf8());
  66.     file.close();
  67. }
  68. MainWindow::~MainWindow()
  69. {
  70.     delete ui;
  71. }
复制代码
结果如下:

四:🔥 文件和目次信息类

QFilelnfo 是 Qt 提供的一个用于获取文件和目次信息的类,如获取文件名、文件巨细、文件修改日期等。QFileInfo 类中提供了很多的方法,常用的有:
方法名称作用isDir()查抄该文件是否是目次isExecutable()查抄该文件是否是可实行文件fileName()得到文件名completeBaseName()获取完备的文件名suffix()获取文件后缀名completeSuffix()获取完备文件后缀size()获取文件巨细isFile()判定是否为文件fileTime()获取文件创建时间、修改时间、近来访问时间等
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QPushButton>
  4. #include <QDebug>
  5. #include <QFileDialog>
  6. Widget::Widget(QWidget *parent)
  7.     : QWidget(parent)
  8.     , ui(new Ui::Widget)
  9. {
  10.     ui->setupUi(this);
  11.     QPushButton* button = new QPushButton("查看文件属性", this);
  12.     connect(button, &QPushButton::clicked, [=](){
  13.        QString path = QFileDialog::getOpenFileName(this);
  14.        QFileInfo fileInfo(path); // 构造对象
  15.        // 打印相关属性
  16.        qDebug() << fileInfo.fileName();
  17.        qDebug() << fileInfo.suffix();
  18.        qDebug() << fileInfo.path();
  19.        qDebug() << fileInfo.size();
  20.        qDebug() << fileInfo.isFile();
  21.        qDebug() << fileInfo.isDir();
  22.        // ...
  23.     });
  24. }
复制代码
五:🔥 其他

① 创建删除目次
  1. #include <QDir>
  2. void createDirectory(const QString &dirPath) {
  3.     QDir dir;
  4.     if (!dir.exists(dirPath)) {
  5.         if (dir.mkpath(dirPath)) {
  6.             qDebug() << "目录创建成功:" << dirPath;
  7.         } else {
  8.             qDebug() << "无法创建目录:" << dir.errorString();
  9.         }
  10.     } else {
  11.         qDebug() << "目录已存在:" << dirPath;
  12.     }
  13. }
  14. void deleteDirectory(const QString &dirPath) {
  15.     QDir dir(dirPath);
  16.     if (dir.exists()) {
  17.         if (dir.rmdir(dirPath)) {
  18.             qDebug() << "目录删除成功:" << dirPath;
  19.         } else {
  20.             qDebug() << "无法删除目录:" << dir.errorString();
  21.         }
  22.     } else {
  23.         qDebug() << "目录不存在:" << dirPath;
  24.     }
  25. }
复制代码
② 选择文件
QFileDialog::getOpenFileName() 函数可以用来打开文件选择对话框,让用户选择文件。
  1. #include <QApplication>
  2. #include <QFileDialog>
  3. #include <QPushButton>
  4. #include <QWidget>
  5. #include <QVBoxLayout>
  6. #include <QMessageBox>
  7. class FileSelector : public QWidget {
  8. public:
  9.     FileSelector() {
  10.         QPushButton *button = new QPushButton("选择文件", this);
  11.         QVBoxLayout *layout = new QVBoxLayout(this);
  12.         layout->addWidget(button);
  13.         
  14.         // 点击按钮时打开文件选择器
  15.         connect(button, &QPushButton::clicked, this, &FileSelector::selectFile);
  16.     }
  17. private slots:
  18.     void selectFile() {
  19.         QString fileName = QFileDialog::getOpenFileName(this, tr("打开文件"), "", tr("所有文件 (*.*);;文本文件 (*.txt)"));
  20.         
  21.         if (!fileName.isEmpty()) {
  22.             QMessageBox::information(this, tr("选择的文件"), fileName);
  23.         }
  24.     }
  25. };
  26. int main(int argc, char *argv[]) {
  27.     QApplication app(argc, argv);
  28.     FileSelector window;
  29.     window.setWindowTitle("文件选择示例");
  30.     window.resize(300, 100);
  31.     window.show();
  32.    
  33.     return app.exec();
  34. }
复制代码
阐明:
QFileDialog::getOpenFileName():用于打开单个文件选择对话框。
参数解释:


  • 第一个参数是父窗口。
  • 第二个参数是对话框标题。
  • 第三个参数是默认路径。
  • 第四个参数是过滤器,用于指定可以选择的文件范例。
③ 选择文件夹
QFileDialog::getExistingDirectory() 用来让用户选择文件夹
  1. #include <QApplication>
  2. #include <QFileDialog>
  3. #include <QPushButton>
  4. #include <QWidget>
  5. #include <QVBoxLayout>
  6. #include <QMessageBox>
  7. class FolderSelector : public QWidget {
  8. public:
  9.     FolderSelector() {
  10.         QPushButton *button = new QPushButton("选择文件夹", this);
  11.         QVBoxLayout *layout = new QVBoxLayout(this);
  12.         layout->addWidget(button);
  13.         
  14.         // 点击按钮时打开文件夹选择器
  15.         connect(button, &QPushButton::clicked, this, &FolderSelector::selectFolder);
  16.     }
  17. private slots:
  18.     void selectFolder() {
  19.         QString folderName = QFileDialog::getExistingDirectory(this, tr("选择文件夹"), "");
  20.         if (!folderName.isEmpty()) {
  21.             QMessageBox::information(this, tr("选择的文件夹"), folderName);
  22.         }
  23.     }
  24. };
  25. int main(int argc, char *argv[]) {
  26.     QApplication app(argc, argv);
  27.     FolderSelector window;
  28.     window.setWindowTitle("文件夹选择示例");
  29.     window.resize(300, 100);
  30.     window.show();
  31.    
  32.     return app.exec();
  33. }
复制代码


  • 留意:QFileDialog::getExistingDirectory():用于打开选择文件夹的对话框。
④ 选择多个文件
假如你想让用户一次选择多个文件,可以使用
  1. QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("选择多个文件"), "", tr("所有文件 (*.*);;图片文件 (*.png *.jpg)"));
  2. if (!fileNames.isEmpty()) {
  3.     for (const QString &fileName : fileNames) {
  4.         // 处理每个文件
  5.         qDebug() << "选择的文件:" << fileName;
  6.     }
  7. }
复制代码
上面三个的区别如下:
名称作用QFileDialog::getOpenFileName()选择单个文件QFileDialog::getExistingDirectory()选择文件夹QFileDialog::getOpenFileNames()选择多个文件这段代码答应用户同时选择多个文件,返回的是 QStringList,可以遍历举行处置惩罚。
⑤ 过滤文件范例
在文件选择对话框中,可以使用过滤器来限定用户选择某些特定范例的文件
  1. QString fileName = QFileDialog::getOpenFileName(this, tr("打开文件"), "", tr("图像文件 (*.png *.jpg);;文本文件 (*.txt);;所有文件 (*.*)"));
复制代码
六:🔥 共勉

😋 以上就是我对 【Qt】文件 的理解, 觉得这篇博客对你有资助的,可以点赞收藏关注支持一波~ 😉

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表