Qt (17)【Qt 文件操作 读写保存】

embedded/2024/9/23 21:02:44/

阅读导航

  • 引言
  • 一、Qt文件概述
  • 二、输入输出设备类
  • 三、文件读写类
  • 四、文件和目录信息类
  • 五、自定义“记事本”

引言

在上一篇文章中,我们学习了Qt的事件处理机制,知道了如何响应用户的操作。但应用程序常常还需要处理文件,比如读写数据。所以,接下来的文章,我们将介绍Qt的文件操作功能,包括如何打开、保存、读取和写入文件等。掌握了这些,您的应用程序就能更好地处理数据了。让我们一起学习吧!

一、Qt文件概述

文件操作是任何应用程序都不可或缺的重要部分。Qt,作为一个功能强大的跨平台开发框架,为开发者提供了丰富的文件操作接口和类。通过这些类,开发者可以轻松实现对文件系统的各种操作,包括但不限于文件的读写、文件信息的获取、文件的复制、重命名以及更复杂的文件管理任务。Qt的跨平台特性确保了无论在哪种操作系统上,文件操作都能保持一致性和高效性。

二、输入输出设备类

在Qt框架中,处理文件读写操作的核心类是QFileQFile类继承自QFileDevice,后者为文件交互操作提供了底层的支持功能。进一步追溯,QFileDevice的基类是QIODevice,这个类在Qt中扮演着至关重要的角色,作为所有输入/输出(I/O)设备的基础。I/O设备指的是能够执行数据输入和输出操作的任何设备,包括但不限于文件、网络通信中的socket、串口、蓝牙等通信接口。

QIODevice类为Qt中的I/O操作提供了一个统一的接口,使得无论是文件操作、网络通信还是其他形式的I/O操作,都可以通过相似的API来实现。因此,Qt中许多与I/O相关的类,如处理文件、网络通信、串口通信等的类,都是从QIODevice直接或间接继承而来的。这种设计使得Qt的I/O系统既灵活又强大,能够支持多种不同的I/O场景。
在这里插入图片描述

简而言之,Qt通过QFileQFileDeviceQIODevice等类构建了一个强大的I/O系统,其中QFile专门用于文件读写,而QIODevice则是所有I/O设备类的基类,为Qt的I/O操作提供了统一的基础。

三、文件读写类

在Qt框架中,文件的读写操作主要依赖于QFile类。QFile类提供了一系列的方法用于处理文件的读写操作,包括但不限于以下几种:

  • 读数据:为了从文件中读取数据,QFile类提供了多个方法,如read()readAll()readLine()等。这些方法允许开发者根据需要读取文件内容的不同部分。
  • 写数据:向文件中写入内容同样可以通过QFile类实现,提供了如write()writeData()等方法。这些方法允许开发者将字符串、字节数组等数据写入到文件中。
  • 关闭文件:在完成文件操作后,为了释放系统资源,应该使用close()方法关闭文件。这是一个良好的编程习惯,可以避免资源泄露等问题。

在进行文件读写之前,必须先使用open()方法打开文件,并指定正确的打开模式。这些打开模式由QIODevice::OpenMode枚举变量定义,包括只读、只写、追加等多种模式,以满足不同的文件操作需求。其取值如下:
在这里插入图片描述
下面是将上述QIODevice::OpenMode枚举值列成表格:

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

🚨🚨注意QIODevice::OpenMode是一个标志,这意味着它可以通过位或操作符(|)组合多个模式。例如,如果你想要以读写和追加模式打开文件,你可以使用QIODevice::ReadWrite | QIODevice::Append

四、文件和目录信息类

QFileInfo 是 Qt 框架中提供的一个非常实用的类,它允许开发者获取关于文件和目录的详细信息。通过这个类,可以轻松地查询文件的名称、大小、修改日期等关键属性。QFileInfo 提供了丰富的方法,以满足不同的查询需求。

  • isDir():此方法用于检查指定的路径是否代表一个目录。
  • isExecutable():此方法用于判断文件是否是一个可执行文件。这通常取决于文件的权限和属性。
  • fileName():此方法返回文件的名称(不包括路径)。
  • completeBaseName():与 fileName() 类似,但在某些情况下,如果文件名包含前缀(如版本号),completeBaseName() 可能会返回更完整的文件名基础部分,具体行为可能依赖于平台和文件命名约定。
  • suffix():此方法返回文件的扩展名(后缀),即文件名中最后一个点(.)之后的部分。
  • completeSuffix():与 suffix() 相比,这个方法可能用于处理更复杂的文件名,返回完整的后缀,包括可能的多个点分隔的部分。但请注意,Qt 的标准 QFileInfo 类通常只提供 suffix() 方法,completeSuffix() 可能指的是特定上下文或Qt版本中的扩展功能。
  • size():此方法返回文件的大小,以字节为单位。
  • isFile():此方法用于判断给定的路径是否确实指向一个文件(而不是目录或其他类型的文件系统条目)。
  • fileTime():获取文件创建时间、修改时间、最近访问时间等

五、自定义“记事本”

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QPlainTextEdit>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void handleAction1();void handleAction2();private:Ui::MainWindow *ui;QPlainTextEdit* edit;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#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* action1 = new QAction("打开");QAction* action2 = new QAction("保存");menu->addAction(action1);menu->addAction(action2);// 指定一个输入框.edit = new QPlainTextEdit();QFont font;font.setPixelSize(20);edit->setFont(font);this->setCentralWidget(edit);// 连接 QAction 的信号槽.connect(action1, &QAction::triggered, this, &MainWindow::handleAction1);connect(action2, &QAction::triggered, this, &MainWindow::handleAction2);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::handleAction1()
{// 1. 先弹出 "打开文件" 对话框. 让用户选择打开哪个文件.QString path = QFileDialog::getOpenFileName(this);// 2. 把文件名显示到状态栏里.QStatusBar* statusBar = this->statusBar();statusBar->showMessage(path);// 3. 根据用户选择的路径, 构造一个 QFile 对象. 并打开文件QFile file(path);bool ret = file.open(QFile::ReadOnly);if (!ret) {// 打开文件失败!statusBar->showMessage(path + " 打开失败!");return;}// 4. 读取文件了.QString text = file.readAll();// 5. 关闭文件!! 千万不要忘记!!file.close();// 6. 读到的内容设置到输入框中.edit->setPlainText(text);
}void MainWindow::handleAction2()
{// 1. 先弹出 "保存文件" 对话框.QString path = QFileDialog::getSaveFileName(this);// 2. 在状态栏中显示这个文件名.QStatusBar* statusBar = this->statusBar();statusBar->showMessage(path);// 3. 根据用户选择的路径, 构造一个 QFile 对象, 并打开文件.QFile file(path);bool ret = file.open(QFile::WriteOnly);if (!ret) {statusBar->showMessage(path + " 打开失败!");return;}// 4. 写文件.const QString& text = edit->toPlainText();file.write(text.toUtf8());// 5. 关闭文件.file.close();
}

运行效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/embedded/115766.html

相关文章

【人工智能】Transformers之Pipeline(十九):文生文(text2text-generation)

目录 一、引言 二、文生文&#xff08;text2text-generation&#xff09; 2.1 概述 2.2 Flan-T5: One Model for ALL Tasks 2.3 pipeline参数 2.3.1 pipeline对象实例化参数 2.3.2 pipeline对象使用参数 ​​​​​​​ 2.3.3 pipeline返回参数 ​​​​​​​​​​​…

ubuntu安装emqx

目录 1.预先下载好emqx压缩包 2.使用tar命令解压 3.进入bin目录 5.放开访问端口18083 6.从通过ip地址访问emqx后台 7.默认用户名密码为admin/public 8.登录后台 9.资源包绑定在此博文可自取 1.预先下载好emqx压缩包 2.使用tar命令解压 sudo tar -xzvf emqx-5.0.8-el8-…

如何使用ssm实现大湾区旅游推荐系统的设计与实现+vue

TOC ssm621大湾区旅游推荐系统的设计与实现vue 第1章 绪论 1.1 研究背景意义及内容 1.1.1 研究背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域…

【C++】类和对象(一)

类的引入 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完成。 C语言结构体中只能定…

WPF自定义Dialog模板,内容用不同的Page填充

因为审美的不同&#xff0c;就总有些奇奇怪怪的需求&#xff0c;使用框架自带的对话框已经无法满足了&#xff0c;这里记录一下我这边初步设计的对话框。别问为啥要用模板嵌套Page来做对话框&#xff0c;问就是不想写太多的窗体。。。。 模板窗体&#xff08;XAML&#xff09;…

PyTorch使用------自动微分模块

目录 &#x1f354; 梯度基本计算 1.1 单标量梯度的计算 1.2 单向量梯度的计算 1.3 多标量梯度计算 1.4 多向量梯度计算 1.5 运行结果&#x1f4af; &#x1f354; 控制梯度计算 2.1 控制不计算梯度 2.2 注意: 累计梯度 2.3 梯度下降优化最优解 2.4 运行结果&#x1…

Gmaefi链游系统开发

GameFi链游系统开发是一个涉及多个环节和技术的复杂过程&#xff0c;旨在将区块链技术与游戏行业相结合&#xff0c;创造具有创新性和吸引力的游戏体验。以下是对GameFi链游系统开发的主要步骤和关键要点的详细分析&#xff1a; 一、定义需求和设计 明确游戏理念和玩法&#xf…

基于PHP+MySQL组合开发的在线客服源码系统 聊天记录实时保存 带完整的安装代码包以及搭建部署教程

系统概述 随着互联网技术的飞速发展&#xff0c;企业与客户之间的沟通方式日益多样化&#xff0c;在线客服系统作为连接企业与客户的桥梁&#xff0c;其重要性不言而喻。然而&#xff0c;市场上现有的在线客服系统往往存在成本高、定制性差、维护复杂等问题。针对这些痛点&…