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.rhkb.cn/news/431211.html

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

相关文章

CVPR最牛图像评价算法!

本文所涉及所有资源均在 传知代码平台可获取。 目录 概述 一、论文思路 1.多任务学习框架&#xff1a; 2.视觉-语言对应关系&#xff1a; 3.动态损失权重&#xff1a; 4.模型优化和评估&#xff1a; 二、模型介绍 三、详细实现方法 1.图像编码器和语言编码器&#xff08;Image…

大语言模型的发展-OPENBMB

一、自然语言处理的基础 1、图灵测试 就是验证人工智能程序有多智能 让计算机像人一样&#xff0c;能够听懂问题&#xff0c;然后给出答案&#xff1b; 自然语言发展历史&#xff1a; advances in Natural Lannguage Processing --论文 2、自然语言处理的基本任务和应用 …

MES系统如何提升制造企业的运营效率和灵活性

参考拓展&#xff1a;苏州稳联-西门子MES系统-赋能智能制造的核心引擎 制造执行系统(MES)在提升制造企业运营效率和灵活性方面发挥着关键作用。 一、MES系统的基本概念和功能 MES系统是连接企业管理层与生产现场的重要桥梁。它主要负责生产调度、资源管理、质量控制等多个方…

【重学 MySQL】三十一、字符串函数

【重学 MySQL】三十一、字符串函数 函数名称用法描述ASCII(S)返回字符串S中的第一个字符的ASCII码值CHAR_LENGTH(s)返回字符串s的字符数&#xff0c;与CHARACTER_LENGTH(s)相同LENGTH(s)返回字符串s的字节数&#xff0c;和字符集有关CONCAT(s1,s2,…,sn)连接s1,s2,…,sn为一个字…

低代码可视化工具--vue条件判断v-if可视化设置-代码生成器

在Vue UniApp中&#xff0c;条件判断通常是通过指令v-if、v-else-if、v-else来实现的。这些机制允许你根据表达式的真假值来决定是否渲染某个元素或元素组&#xff0c;或者执行特定的逻辑。 条件判断说明 v-if 是惰性的&#xff1a;如果在初始渲染时条件为假&#xff0c;则什么…

如何使用ssm实现基于Java web的高校学生课堂考勤系统的设计与实现+vue

TOC ssm686基于Java web的高校学生课堂考勤系统的设计与实现vue 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#x…

BUUCTF [SCTF2019]电单车详解两种方法(python实现绝对原创)

使用audacity打开&#xff0c;发现是一段PT2242 信号 PT2242信号 有长有短&#xff0c;短的为0&#xff0c;长的为1化出来 这应该是截获电动车钥匙发射出的锁车信号 0 01110100101010100110 0010 0前四位为同步码0 。。。中间这20位为01110100101010100110为地址码0010为功…

Leetcode 反转链表

使用递归 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ class S…

Java基础知识扫盲

目录 Arrays.sort的底层实现 BigDecimal(double)和BigDecimal(String)有什么区别 Char可以存储一个汉字吗 Java中的Timer定时调度任务是咋实现的 Java中的序列化机制是咋实现的 Java中的注解是干嘛的 Arrays.sort的底层实现 Arrays.sort是Java中提供的对数组进行排序的…

动态规划11,完全背包模板

NC309 完全背包 问题一&#xff1a;求这个背包至多能装多大价值的物品&#xff1f; 状态表示&#xff1a;经验题目要求 dp[i][j] 表示 从前i个物品中挑选&#xff0c;总体积不超过j&#xff0c;所有选法中&#xff0c;能选出来的最大价值。 状态转移方程 根据最后一步的状态&a…

harmonyOS ArkTS最新跳转Navigation

文章目录 取消标题栏初始页面(load)设置为竖屏 自定义标题Tabs&TabContentTabs通过divider实现了分割线各种属性 图片下载 官方文档 Entry Component struct Index {State message: string Hello WorldState djs:number 5build() {Column(){Navigation(){}.title("g…

达梦-华为鲲鹏ARM架构下性能测试最佳实践

一、测试综述 1.1 测试目的 本次测试的目的是验证达梦数据库&#xff0c;在鲲鹏服务器下&#xff0c;不同服务器参数基于sysbench性能压力测试的表现。本次参数是根据为华为鲲鹏arm服务器调优十板斧内建议值调整 成长地图-鲲鹏开发套件开发文档-鲲鹏社区 1.2 通用指标 指标…

基于STM32的点滴输液报警器-设计说明书

设计摘要&#xff1a; 本文介绍了基于STM32微控制器的点滴输液报警器的设计与实现。点滴输液是医疗领域中常见的治疗方式&#xff0c;但输液速度的控制对患者的安全和治疗效果至关重要。因此&#xff0c;设计一种能够监测输液速度并在异常情况下发出警报的系统显得十分必要。基…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)2.3-2.4

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第二周 深度卷积网络&#xff1a;实例探究&#xff08;Deep convolutional models: case studies&#xff09;2.3 残差网络(ResNets)(Residual Networks (ResNets))2.4 残差网络为什么有用&am…

JavaEE: 深入探索TCP网络编程的奇妙世界(一)

文章目录 TCPTCP协议段落格式TCP相关机制TCP核心机制一: 确认应答32位序号32位确认序号后发先至问题 TCP TCP要比UDP更复杂一些~ TCP的全称为"传输控制协议".他负责对数据的传输进行一个详细的控制. TCP协议段落格式 源/目的端口号: 表示数据是从哪个进程来.到哪个…

Python 如何处理大文件的读取

Python 如何处理大文件的读取 在日常的开发工作中&#xff0c;我们经常会遇到处理大文件的需求。无论是读取日志文件、处理数据集&#xff0c;还是分析超大文本文件&#xff0c;大文件操作都是一个非常常见的挑战。尤其是在内存有限的环境中&#xff0c;直接将整个文件加载到内…

Docker配置代理解决pull超时问题

操作系统: CentOS Linux 8 Docker版本: 26.1.3 前置&#xff1a;你需拥有&#x1f431; 1. 配置 proxy.conf 1.1 创建配置文件目录 创建 docker.service.d&#xff0c;进入到 docker.service.d 中打开 proxy.conf (没有文件打开会自动创建)。 注意&#xff1a;每个人的路径可…

深度学习|误差逆传播:梯度速解

文章目录 引言链式法则误差逆传播加法的逆传播乘法的逆传播逆传播求梯度 SoftmaxWithLoss 层正向传播逆传播代码实现参考 结语 引言 我们知道训练神经网络模型的核心是以损失函数为基准来调整优化网络参数&#xff0c;使得网络的输出尽可能接近真实标签。在神经网络中&#xf…

Vue使用qrcodejs2-fix生成网页二维码

安装qrcodejs2-fix npm install qrcodejs2-fix核心代码 在指定父view中生成一个二维码通过id找到父布局 //通过id找到父布局let codeView document.getElementById("qrcode")new QRCode(codeView, {text: "测试",width: 128,height: 128,colorDark: #00…

Fyne ( go跨平台GUI )中文文档-小部件 (五)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…