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

阅读导航

  • 引言
  • 一、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.xdnf.cn/news/142286.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

应用软件系统开发 实操一:任务需求描述

一、实操一&#xff1a;任务需求描述 软件和信息技术服务业数据统计平台是一个为不同级别管理员提供定制化服务的系统。它主要面向数据管理员和系统运维管理员&#xff0c;每一种用户角色各自拥有特定的功能权限。系统运维管理员是专门针对平台基础功能的管理人员&#xff0c;它…

08_Python数据类型_字典

Python的基础数据类型 数值类型&#xff1a;整数、浮点数、复数、布尔字符串容器类型&#xff1a;列表、元祖、字典、集合 字典 字典&#xff08;Dictionary&#xff09;是一种可变容器模型&#xff0c;它可以存储任意类型对象&#xff0c;其中每个对象都存储为一个键值对。…

如何评估土壤功能?瓦赫宁根大学研究团队在土壤学一区TOP期刊最新成果给出答案!

本文首发于“生态学者”微信公众号&#xff01; 土壤健康是农业可持续发展的关键因素之一&#xff0c;而土壤有机碳&#xff08;Soil Organic Carbon, SOC&#xff09;含量是衡量土壤健康最常用的指标。然而&#xff0c;许多土壤功能不仅受SOC总量的影响&#xff0c;还与其质量…

FreeRTOS学习——链表list

FreeRTOS学习——链表&#xff08;列表&#xff09;list&#xff0c;仅用于记录自己阅读与学习源码 FreeRTOS Kernel V10.5.1 参考大佬的好文章&#xff1a; freertos内核原理 Day1(链表) FreeRTOS-链表的源码解析 *list_t只能存储指向list_item_t的指针。每个list_item_t都…

photozoom classic 9解锁码2024年最新25位解锁码

photozoom classic 9 破解版顾及比恐龙还要稀有&#xff0c;我曾经和你一样一直再找&#xff0c;找了好几个月&#xff0c;也没有找到真的破解版&#xff0c;下载很多次&#xff0c; 都是病毒插件之类的 我昨天下了几次&#xff0c;没有一个不附带插件病毒木马的.......&#x…

基于深度学习的图像分类或识别系统(含全套项目+PyQt5界面)

目录 一、项目界面 二、代码实现 1、网络代码 2、训练代码 3、评估代码 4、结果显示 三、项目代码 一、项目界面 二、代码实现 1、网络代码 该网络基于残差模型修改 import torch import torch.nn as nn import torchvision.models as modelsclass resnet18(nn.Modul…

数据结构(2):LinkedList和链表[2]

我们在上一篇文章中着重讨论了单链表的实现。其中我们要注意单链表进行遍历时一步一步走的思想。那么这篇文章我们将继续讨论链表的更多内容&#xff0c;那就让我们开始吧。 1.经典单链表算法题 我们将通过几个经典的题对单链表进行进一步的认识。 (1)反转链表 206. 反转链…

cas 5.3服务器搭建

项目环境要求 jdk1.8&#xff0c;tomcat8 网盘下载&#xff08;官网下载速度慢可以用此方法下载&#xff09; 网盘链接&#xff1a;8910官网各稳定版本&#xff0c;软件包点击自取 cas5.3git代码 https://github.com/apereo/cas-overlay-template/tree/5.3 刚拉下来的代码目录…

OJ题-反转链表

给你一个单链表的头节点&#xff0c;请反转链表&#xff0c;并返回新的链表 eg&#xff1a; 1,2,3,4,5--->5,4,3,2,1 //反转链表 struct ListNode* reverseList(struct ListNode* head) {//定义三个变量struct ListNode* n1, * n2, * n3;n1 NULL;n2 head;n3 head->n…

鸿蒙开发之ArkTS 基础九 枚举类型

枚举把变量固定在特定的范围内 枚举的语法&#xff1a; enum 枚举名字 { 常量1 值1, 常量1 值1, 常量1 值1, ... } 定义具体如下: 使用具体如下&#xff1a;

centos更改静态ip

点击网络和internet设置 点击更改适配器 、点击属性

【C++题目】1.日期差值

日期差值 题目&#xff1a; 链接&#x1f517;&#xff1a;日期差值 代码&#xff1a; #include <iostream> using namespace std; /* *思路&#xff1a; * 1. 分别求出每一个日期与0000年0月1日距离的天数 * 2. 两个距离天数相减即可得到两个日期相差的天数 *///平年…

宿舍管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 宿舍管理系统拥有三个角色&#xff0c;分别为系统管理员、宿舍管理员以及学生。其功能如下&#xff1a; 管理员&#xff1a;宿舍管理员管理、学生管理、宿舍楼管理、缺勤记录管理、个人密…

【高录用 | EI快检索, IEEE出版】第二届人工智能与自动化控制国际学术会议(AIAC 2024)

会议官网&#xff1a;www.icaiac.org The 2nd International Conference on Artificial Intelligence and Automation Controlwww.icaiac.org 电气电子工程师学会&#xff08;IEEE&#xff09;的英文全称是the Institute of Electrical and Electronics Engineers。作为全球最…

hh exe所选的程序不能与此文件类型相关联。请选择其他程序。

按照hh exe打开chm文件显示所选的程序不能与此文件类型相关联。请选择其他程序。 以上错误来自于 cmd命令行 cd C:\Windows\hh.exe 要打开的chm文件报错 其实根本原因是在设置中.chm文件默认打开方法被其他软件占用了&#xff0c;解决办法只能删除那个软件&#xff0c;如果是W…

认知杂谈68《燃爆!兄弟萌不可错过的人生开挂宝典》

内容摘要​&#xff1a; 生活如舞台&#xff0c;我们要做自己人生的导演兼主演。实现自我成长需打牢基础&#xff0c;如读《认知觉醒》等书并制定成长计划。 要向上生长&#xff0c;定短期和长期目标&#xff0c;学新技能、提升沟通能力&#xff0c;可借助在线平台和社群。用番…

医院伤员食堂管理系统开通方法———未来之窗行业应用跨平台架构

一、 医院伤员食堂管理建设必要性 1. 提高服务质量 - 能够更精准地满足伤员的特殊饮食需求&#xff0c;如根据病情提供不同的营养搭配&#xff0c;有助于伤员的康复。 - 及时响应伤员的反馈&#xff0c;改进餐饮服务&#xff0c;提升伤员的满意度。 2. 优化资源配置 …

Java 枚举 新特性

Java 枚举&#xff08;enum&#xff09;自JDK 1.5引入以来&#xff0c;随着版本的升级不断增强。本文将回顾枚举的演进&#xff0c;尤其是结合switch语句的应用&#xff0c;展示枚举如何在现代Java中变得更加灵活。 1. JDK 1.5&#xff1a;Java 枚举的诞生 在JDK 1.5之前&…

‌PhotoZoom Pro 9‌和‌PhotoZoom Classic 9‌都提供了多项新功能

​PhotoZoom 9是一款划时代的、技术上产生革命性影响的数码图片放大工具。该软件使用了全新的S-Spline技术&#xff08;拥有自动调节、领先的差值算法等技术及亮点&#xff09;&#xff0c; 开创了图片放大技术的新领域&#xff0c;采用更为领先的优化算法&#xff0c;对不断放…

【C++11 —— 线程库】

C11 —— 线程库 thread类介绍线程函数参数原子性操作库(atomic)lock_guard与unique_lockmutex的种类lock_guardunique_lock 两个线程交替打印奇偶数 thread类介绍 在C11之前&#xff0c;涉及到多线程的问题&#xff0c;都是和平台相关的&#xff0c;比如windows和Linux下各有…