【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.mzph.cn/news/775758.shtml

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

相关文章

android 消息提醒

1.创建 MyBackgroundService.java 继承 Service public class MyBackgroundService extends Service {Overridepublic void onCreate() {super.onCreate();Log.i("业务服务", "开起业务服务");//调用服务后在页面手机上创建一个通知消息。if (android.os…

日本EPSON 爱普生HUD汽车抬头显示系统芯片

目前HUD产品在新车上的配装率逐年上升,预计在2025年将达到30%。那么在介绍爱普生HUD整合方案之前,让我们先了解一下什么叫HUD。 HUD(Head Up Display)中文叫抬头显示系统,又被叫做平行显示系统。早被应用在飞机辅助…

vue基础——java程序员版(总集)

前言: ​ 这是一个java程序员的vue学习记录。 ​ vue是前端的主流框架,按照如今的就业形式作为后端开发的java程序员也是要有所了解的,下面是本人的vue学习记录,包括vue2的基本使用以及引入element-ui,使用的开发工具…

Github 2024-03-28 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-28统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4Jupyter Notebook项目2TypeScript项目2非开发语言项目2Solidity项目1Go项目1Open Interpreter: 本地代码运行和自然语言界面 创建周…

大型驱动水冷负载电阻、缓冲器、滤波器和快速放电电阻

EAK业界首创双面水冷负载电阻器,独特的设计,用户更方便的串联并联使用,强大的水流带走更多因充放电带来的热量。AlN高可靠性氮化铝基板保证了热膨胀不会影响电阻的工作。 液冷电阻器使用水或离子水作为冷却剂。通过添加乙二醇,可以…

如何高效阅读嵌入式代码

大家好,今天给大家介绍如何高效阅读嵌入式代码,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 高效阅读嵌入式代码需要一些技巧和实践经验。以下是一些建议&#xff…

HarmonyOS入门笔记--页面和自定义组件生命周期

文章目录 页面和自定义组件生命周期页面生命周期组件生命周期生命周期的调用时机 页面和自定义组件生命周期 生命周期流程如下图所示,下图展示的是被Entry装饰的组件(首页)生命周期。 自定义组件和页面的关系: 自定义组件&…

EdgeGallery开发指南

API接口 简介 EdgeGallery支持第三方业务系统通过北向接口网关调用EdgeGallery的业务接口。调用流程如下图所示(融合前端edgegallery-fe包含融合前端界面以及北向接口网关功能,通过浏览器访问时打开的是融合前端的界面,通过IP:Port/urlPref…

机器学习——聚类算法-KMeans聚类

机器学习——聚类算法-KMeans聚类 在机器学习中,聚类是一种无监督学习方法,用于将数据集中的样本划分为若干个簇,使得同一簇内的样本相似度高,不同簇之间的样本相似度低。KMeans聚类是一种常用的聚类算法之一,本文将介…

反应式编程(二)什么是粘包、拆包?如何解决?

目录 一、粘包、拆包介绍1.1 什么是 TCP 协议?1.2 什么是粘包、拆包?1.3 粘包、拆包的四种情况1.4 粘包、拆包的原因1)TCP协议中的滑动窗口机制2)传输层的 MSS 与链路层的 MTU3)TCP协议中的 Nagle 算法4)应…

布隆过滤器详讲

本文旨在讲解布隆过滤器的原理以及实现方式,希望通过本文能使读者对布隆过滤器有一定的认识! 一、布隆过滤器的引入 在讲解布隆过滤器之前,我们还是先提及一下前面讲的位图行,位图可以处理大量的数据,广泛用于查找等…

LoadBalance 负载均衡服务调用

前身:Ribbon LB负载均衡(Load Balance)是什么 简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用),常见的负载均衡有软件Nginx,LVS,硬件 F5等 spring-cloud-starter-loadbalancer组…

【独立开发前线】Vol.23 这个卖Excel课程的网站,月访问量14.5万,年销售额超过200万美金

今天要给大家分享的案例网站是:Miss-Excel 网址是:Miss Excel 这是一个专门销售Excel课程的网站,网址一共有18个系列的视频课程,最便宜的44美金,最贵的1197美金。所有的课程都是网站的创始人Kat Norton录制的&#xf…

C语言文件操作详解

文件是什么 在我们日常使用的电脑上我们在电脑磁盘上会看到许许多多的文件夹,那里面的东西其实就是文件,为什么我们要使用文件?那是因为我们的电脑肯定会要用来存储东西的,如果没有文件,那么我们的东西都全部存放在内…

【沐风老师】3DMAX顶点投影插件VertexProjection使用方法详解

3DMAX顶点投影插件VertexProjection使用教程 3DMAX顶点投影插件VertexProjection,将可编辑多边形顶点向下投影到网格对象表面。可以对可编辑多边形对象上的所有顶点或部分顶点进行投影。主要用于地形建模、道路交通等领域。 【适用版本】 3dMax 2010 - 2024&#x…

vue3路由代码示例

路由简单分三步吧 第一定义路由&#xff1a; 包括访问地址&#xff0c;对应组件 第二使用&#xff1a;在index.html中使用它 下面是代码示例&#xff1a; components/Person.vue <template><router-link to"/test/hello">跳转</router-link>&…

一键换脸的facefusion

FaceFusion 一个开源换脸软件&#xff0c;提供UI界面&#xff0c;启动后可直接在浏览器上面上传图片进行换脸操作。 电脑环境win10&#xff0c;软件pycharm&#xff0c;需要提前安装好python环境&#xff0c;推荐使用Anaconda3。关注文章下方公共号发送 “ 软件安装包 ”可以获…

Leetcode239_滑动窗口最大值

1.leetcode原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2.题目描述 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口…

夜莺浏览日志、filebeat采集日志(四)

文章目录 一、elasticsearch二、filebeat三、日志分析 一、elasticsearch docker启动 docker run -d -p 9200:9200 -p 9300:9300 --restartalways -e ES_JAVA_OPTS"-Xms512m -Xmx512m" \ -e discovery.typesingle-node -e xpack.security.enabledtrue -e ELASTIC_P…

plantegg-10+倍性能提升全过程–优酷账号绑定淘宝账号的TPS从500到5400的优化历程

原文地址:https://plantegg.github.io/2018/01/23/10%E5%80%8D%E6%80%A7%E8%83%BD%E6%8F%90%E5%8D%87%E5%85%A8%E8%BF%87%E7%A8%8B/ 背景说明 2016年的双11在淘宝上买买买的时候&#xff0c;天猫和优酷土豆一起做了联合促销&#xff0c;在天猫双11当天购物满XXX元就赠送优酷会…