【Qt学习】了解Qt文件系统 + 利用QFile类实现记事本功能

文章目录

  • 1. 前言 - 关于Qt文件
    • 1.1 QIODevice 介绍
    • 1.2 QFile 介绍
    • 1.2 打开文件的方式
  • 2. 实例 - 记事本功能
    • 2.1 功能实现
    • 2.2 getOpenFileName() 与 getSaveFileName() 的区别
    • 2.3 效果演示
  • 3. 资源文件

1. 前言 - 关于Qt文件

文件操作 是应⽤程序必不可少的部分,Qt作为一个通用开发库,提供了丰富的文件操作类,使得应用程序能够方便地进行文件系统操作。

1.1 QIODevice 介绍

QIODevice 是 Qt 中用于 处理输入输出操作的抽象基类 ,它为文件、网络套接字、串口等设备提供了统一的接口。

下面是QIODevice的子类

QIODevice 子类描述
QFile用于读写文件
QBuffer在内存中创建缓冲区进行数据读写
QProcess用于启动外部进程并进行通信
QNetworkReply处理网络请求响应数据
QTcpSocket用于 TCP 网络套接字通信
QUdpSocket用于 UDP 网络套接字通信
QSslSocket支持 SSL 加密的套接字类
QLocalSocket用于本地套接字通信

1.2 QFile 介绍

这里我们主要使用 QFile 类,提供了对文件的读写功能。QFile 类可以用于打开、读取、写入和关闭文件,以及获取文件信息等操作

下面是QFile的 常用方法:

方法描述
QFile(const QString &name)构造函数,创建一个 QFile 对象并指定文件名。
bool open(QIODevice::OpenMode mode)打开文件,可以指定打开模式,如只读、只写、读写等。
qint64 read(char *data, qint64 maxSize)从文件中读取最多 maxSize 字节的数据到指定的 data 缓冲区中。
qint64 write(const char *data, qint64 maxSize)将数据写入文件,最多写入 maxSize 字节的数据。
bool exists()判断文件是否存在。
qint64 size()返回文件的大小。
bool remove()删除文件。
bool rename(const QString &newName)重命名文件。
bool copy(const QString &newName)复制文件到指定路径。
bool flush()刷新文件缓冲区。

1.2 打开文件的方式

当涉及到文件I/O时,Qt提供了多种打开文件的方式。

  • 下面为常用的打开方式:
打开方式描述
QFile::ReadOnly以只读方式打开文件。
QFile::WriteOnly以只写方式打开文件。
QFile::ReadWrite以读写方式打开文件。
QFile::Append以追加方式打开文件。
QFile::Text以文本模式打开文件。
QFile::Truncate如果文件已经存在,则清空文件内容。
QFile::Unbuffered禁用文件缓冲,直接进行物理I/O操作。
QFile::NewOnly如果文件已经存在,则打开失败。
QFile::ExistingOnly如果文件不存在,则打开失败。

2. 实例 - 记事本功能

2.1 功能实现

下面我们通过上面介绍的类等实现一个简单的记事本,包括三个功能:

  1. 新建窗口
  2. 打开文件
  3. 保存文件

在这里插入图片描述

  • 首先在widget.h中对相关 信号 / 槽函数 进行声明:
class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void handleActionBuild(); // 处理 “新建” 按钮void handleActionOpen(); // 处理 “打开”按钮void handleActionSave(); // 处理 “保存”按钮private:Ui::MainWindow *ui;QPlainTextEdit* edit; // 输入框
};
  • 在widget.cpp中的Widget构造函数中进行 控件的创建,以及信号槽的连接:
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* actionBuild = new QAction("新建");QAction* actionOpen = new QAction("打开");QAction* actionSave = new QAction("保存");menu->addAction(actionBuild);menu->addAction(actionOpen);menu->addAction(actionSave);// 设定输入框edit = new QPlainTextEdit();QFont font; // 字体设定font.setPixelSize(20);edit->setFont(font);// 将输入框加入到窗口中this->setCentralWidget(edit);// 连接 QAction 的信号槽connect(actionBuild, &QAction::triggered, this, &MainWindow::handleActionBuild);connect(actionOpen, &QAction::triggered, this, &MainWindow::handleActionOpen);connect(actionSave, &QAction::triggered, this, &MainWindow::handleActionSave);
}
  • 随后分别对三个功能的槽函数进行实现(handleActionOpen)(handleActionSave)(handleActionBuild):
    • 对于每段代码功能的实现,都有相应的注释标注。

handleActionBuild

// 新建窗口
void MainWindow::handleActionBuild()
{// 新建一个记事本窗口MainWindow *newNoteWindow = new MainWindow; // 创建一个新的记事本窗口实例// 显示新的记事本窗口newNoteWindow->show();
}

handleActionOpen

void MainWindow::handleActionOpen()
{// 1. 弹出打开文件QString path = QFileDialog::getOpenFileName(this);// 2. 将 路径信息 展示到statusBar上QStatusBar* statusBar = this->statusBar();statusBar->showMessage(path);// 3. 将文件加载到QFile中,并打开QFile file(path);if(!file.open(QFile::ReadWrite)) // open的返回值是bool{// 打开文件失败statusBar->showMessage("打开文件失败: " + path);return;}// 读取文件内容QString text = file.readAll();// 关闭文件file.close();// 将内容设置到输入框edit->setPlainText(text);
}

handleActionSave

void MainWindow::handleActionSave()
{// 1. 弹出 保存文件QString path = QFileDialog::getSaveFileName(this);// 2. 保存路径信息到 状态栏QStatusBar* statusBar = this->statusBar();statusBar->showMessage(path);//QFile file(path);if(!file.open(QFile::WriteOnly)){statusBar->showMessage("打开文件失败: " + path);return;}// 写文件const QString& text = edit->toPlainText();file.write(text.toUtf8()); // 转为utf8// 关闭文件file.close();
}

2.2 getOpenFileName() 与 getSaveFileName() 的区别

QFileDialog::getOpenFileName()QFileDialog::getSaveFileName() 是 Qt 中用于打开文件和保存文件对话框的两个函数,它们的主要区别在于其作用和用户交互方面:

  1. QFileDialog::getOpenFileName()

    • 用途:用于打开文件对话框,允许用户选择一个已存在的文件。
    • 功能:用户可以浏览文件系统,选择一个或多个文件以供应用程序使用。
    • 返回值:返回用户选择的文件的路径。
  2. QFileDialog::getSaveFileName()

    • 用途:用于保存文件对话框,允许用户指定一个文件路径来保存数据。
    • 功能:用户可以指定文件名、文件类型和保存位置来保存数据。
    • 返回值:返回用户选择的保存文件的路径。

总的来说,getOpenFileName() 用于打开已存在的文件,而 getSaveFileName() 用于保存新文件。


2.3 效果演示

最终效果如下:

在这里插入图片描述


3. 资源文件

上述所涉及的 代码等资源文件在👇:

QFile的使用,记事本功能的实现

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript中的继承方式详解

Question JavaScript实现继承的方式? 包含原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承和ES6 类继承 JavaScript实现继承的方式 在JavaScript中,实现继承的方式多种多样,每种方式都有其优势和适用场景。以下…

XR虚拟直播间,引领创新风潮,打破直播局限!

随着互联网技术日新月异的发展,直播行业也迎来了蓬勃发展的春天。然而,大多数直播间在吸引观众眼球和延长用户观看时长方面,仍然面临着巨大的挑战。正是在这样的背景下,XR虚拟直播系统应运而生,以其多维度的直播场景、…

Mac上的Gatekeeper系统跟运行时保护

文章目录 问题:无法打开“xxx.xxx”,因为无法验证开发者。macOS无法验证此App是否包含恶意软件。如何解决? 参考资料门禁运行时保护 问题:无法打开“xxx.xxx”,因为无法验证开发者。macOS无法验证此App是否包含恶意软件…

【C语言】linux内核pci_iomap

一、pci_iomap /** pci_iomap 是一个用于映射 PCI 设备的 BAR(Base Address Register,基地址寄存器)的函数。* 此函数返回指向内存映射 IO 的指针,用于直接访问 PCI 设备的内存或 I/O 空间。* * 参数:* dev - 指向pci_dev结构的指…

ClickHouse初体验

1.clickHouse是啥? ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库(DBMS),使用 C语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告 2.clickHouse的特点 2.1列式存储 对于列的聚合&…

SEO 的未来:GPT 和 AI 如何改变关键词研究

谷歌Gemini与百度文心一言:AI训练数据的较量 介绍 想象一下,有一个工具不仅可以理解错综复杂的关键字网络,还可以预测搜索引擎查询的变化趋势。 这就是生成式预训练 Transformer (GPT) 和其他人工智能技术发挥作用的地方,以我们从…

基于RK3588多can口多串口机器人全功能板

RK3588机器人控制器有五大技术优势 1. 内置多种功能强大的嵌入式硬件引擎,支持8K60fps 的 H.265 和 VP9 解码器、8K30fps 的 H.264 解码器和 4K60fps 的 AV1 解码器;支持 8K30fps 的 H.264 和H.265 编码器,高质量的 JPEG 编码器/解码器&…

二十 超级数据查看器 讲解稿 功能概述

二十 超级数据查看器 讲解稿 功能概述 ​ ​​点击此处 以新页面 打开B站 播放当前教学视频 点击访问app下载页面 豌豆荚 下载地址​ ​ 讲解稿 ​ 界面启动 ​ 导入 ​ 选excel文件 导入 ​ 原来的excel文件 ​ 导入进本地数据库sqlite ​ 导入成功 ​ 列…

Lilishop商城(windows)本地部署【docker版】

Lilishop商城(windows)本地部署【docker版】 部署官方文档:LILISHOP-开发者中心 https://gitee.com/beijing_hongye_huicheng/lilishop 本地安装docker https://docs.pickmall.cn/deploy/win/deploy.html 命令端页面 启动后docker界面 注…

C++ STL教程

C STL教程 文章目录 C STL教程1.1 std::vector1.1.1vector的定义1.1.2vector容器的初始化1.1.3vector容器内元素的访问和修改1.1.4vector中的常用函数 1.2 std::string1.2.1string的定义1.2.2string的初始化1.2.3string中元素的访问和修改1.2.4string中连接字符串1.2.5string中…

C++类模板详解

在学习类模板之前可以了解一下函数模板,可以参考我的另一篇文章C函数模板详解(结合代码)-CSDN博客 讲解的比较详细,有助于理解类模板。 目录 1、什么是类模板? 2、类模板与函数模板区别 3、类模板对象做函数参数 …

单调栈(C++)

单调栈,即栈中元素是单调递增的或是单调递减的,是一个比较好用的数据结构. 柱状图中最大的矩形 84. 柱状图中最大的矩形 - 力扣(LeetCode) 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。…