Qt入门8——Qt文件

1. Qt文件概述

文件操作是应用程序必不可少的部分。Qt作为⼀个通用开发库,提供了跨平台的文件操作能力。Qt 提供了很多关于文件的类,通过这些类能够对文件系统进行操作,如文件读写、文件信息获取、文件复制或重命名等。

2. 输入输出设备类

在Qt中,文件读写的类为QFile。QFile的父类为QFileDevice,QFileDevice提供了文件交互操作的 底层功能。QFileDevice的父类是QIODevice,QIODevice的父类为QObject。
QIODevice是Qt中所有输入输出设备(input/outputdevice,简称I/O设备)的基础类,I/O设备就是能进行数据输入和输出的设备,例如文件是⼀种I/O设备,网络通信中的socket是I/O设备,串口、蓝牙等通信接口也是I/O设备,所以它们也是从QIODevice继承来的。
Qt中主要的⼀些I/O设备类的继承关系如下图所示:

在这里插入图片描述
说明:

①QFile是用于文件操作和⽂件数据读写的类,使用QFile可以读写任意格式的文件;
②QSaveFile是用于安全保存文件的类。使用QSaveFile保存⽂件时,它会先把数据写⼊一个临时文件,成功提交后才将数据写入最终的文件。如果保存过程中出现错误,临时⽂件里的数据不会被写入最终文件,这样就能确保最终文件中不会丢失数据或被写⼊部分数据。在保存比较大的文件或复杂格式的文件时可以使用这个类,例如从网络上下载文件等;
③QTemporaryFile是用于创建临时文件的类。使用函数QTemporaryFile::open()就能创建⼀个文件名唯⼀的临时文件,在QTemporaryFile对象被删除时,临时⽂件被自动删除;
④QTcpSocket和QUdpSocket是分别实现了TCP和UDP的类;
⑤QSerialPort是实现了串口通信的类,通过这个类可以实现计算机与串口设备的通信;
⑥QBluetoothSocket是用于蓝牙通信的类。手机和平板计算机等移动设备有蓝牙通信模块,笔记本电脑⼀般也有蓝牙通信模块。通过QBluetoothSocket类,就可以编写蓝牙通信程序。如编程实现笔记本电脑与手机的蓝牙通信。
⑦QProcess类用于启动外部程序,并且可以给程序传递参数;
⑧QBuffer以⼀个QByteArray对象作为数据缓冲区,将QByteArray对象当作⼀个I/O设备来读写

3. 文件读写类

在Qt中,文件的读写主要是通过QFile类来实现。在QFile类中提供了⼀些用来读写文件的方法。对于文件的操作主要有:
①读数据:QFile类中提供了多个方法用于读取文件内容;如read()、readAll()、readLine()等。 ②写数据:QFile类中提供了多个方法用于往文件中写内容; ③关闭文件:文件使用结束后必须用函数close()关闭文件。
访问⼀个设备之前,需要使用open()函数打开该设备,而且必须指定正确的打开模式,QIODevice中所有的打开模式由QIODevice::OpenMode枚举变量定义,其取值如下如write()、writeData()等。

在这里插入图片描述
示例:实现一个简单记事本

  1. 在构造函数编写菜单栏
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);
}

2.连接信号槽并编写槽函数

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//连接信号槽connect(action1,&QAction::triggered,this,&MainWindow::handleAction1);connect(action2,&QAction::triggered,this,&MainWindow::handleAction2);
}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(QIODevice::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(QIODevice::WriteOnly);if(!ret){statusbar->showMessage(path + "打开失败!");return;}//4.写文件const QString& text = edit->toPlainText();file.write(text.toUtf8());//5.关闭文件file.close();
}

效果如图:
在这里插入图片描述

4. 文件和目录信息类

QFileInfo是Qt提供的⼀个用于获取文件和目录信息的类,如获取文件名、文件大小、文件修改日期等。QFileInfo类中提供了很多的方法,常用的有:
① isDir() 检查该文件是否是目录;
② isExecutable() 检查该文件是否是可执行文件;
③ fileName()获得文件名;
④ completeBaseName() 获取完整的文件名;
⑤ suffix() 获取文件后缀名;
⑥completeSuffix() 获取完整的文件后缀;
⑦ size() 获取文件大小;
⑧ isFile() 判断是否为文件;
⑨fileTime() 获取文件创建时间、修改时间、最近访问时间等;

示例:

  1. ui界面创建一个label和一个按钮
    在这里插入图片描述
  2. 编写代码
void Widget::on_pushButton_clicked()
{//弹出对话框,并获取文件的属性信息QString path = QFileDialog::getOpenFileName(this);//构造出一个QFileInfo对象QFileInfo fileinfo(path);//获取相关属性到labelui->label->setText("文件名称:" + fileinfo.fileName() + "\n文件后缀:" + fileinfo.suffix()+ "\n文件路径为:" + fileinfo.path() + "\n文件大小为:" + QString::number(fileinfo.size()));
}

效果如图:
在这里插入图片描述

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

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

相关文章

常量变量和一些运算符

3.4 变量 常量:!final关键字 final修饰基本类型不可以第二次赋值final修饰的引用类型不可以第二次改变指向final修饰的类不可以被继承final修饰的方法不可以被重写final防止指令重排序,遏制流水线性能优化,保障多线程并发场景下…

内存管理面试常问

为什么要有虚拟内存? 虚拟内存 如果你是电⼦相关专业的,肯定在⼤学⾥捣⿎过单⽚机。 单⽚机是没有操作系统的,所以每次写完代码,都需要借助⼯具把程序烧录进去,这样程序才能跑起来。 另外, 单⽚机的 CPU …

MongoDB分片集群搭建及扩容

分片集群搭建及扩容 整体架构 环境准备 3台Linux虚拟机,准备MongoDB环境,配置环境变量。一定要版本一致(重点),当前使用 version4.4.9 配置域名解析 在3台虚拟机上执行以下命令,注意替换实际 IP 地址 e…

【HarmonyOS】层级轮播卡片效果

【HarmonyOS】层级轮播卡片效果 一、功能效果: 1.上下堆叠由大到小的卡片层叠效果。 2.上层卡片可手势左右滑动,自动左滑动。 3.三层卡片随滑动,内容进行依次切换。 二、开发思路 【完整代码见章节三】 1.最上层使用swiper进行轮播效果…

Python_Flask02

所有人都不许学Java了,都来学Python! 如果不来学的话请网爆我的老师 连接前的准备 安装pymysql 和 flask_sqlalchemy,安装第三下面两个所需要的包才能连接上数据库 pip install pymysql pip install flask_sqlalchemy pymysql是一个Pyth…

实验13 使用预训练resnet18实现CIFAR-10分类

1.数据预处理 首先利用函数transforms.Compose定义了一个预处理函数transform,里面定义了两种操作,一个是将图像转换为Tensor,一个是对图像进行标准化。然后利用函数torchvision.datasets.CIFAR10下载数据集,这个函数有四个常见的…

linux下使用gdb运行程序,查看程序崩溃原因

1.什么是gdb? gdb 是 GNU Debugger 的缩写,是一个功能强大的用于调试程序的开源调试器工具。它可以帮助开发人员诊断和解决程序中的错误、跟踪程序执行过程、查看变量的值等。gdb 支持多种编程语言,包括 C、C、Objective-C、Fortran 等,并可…

鸿蒙arkts怎么打印一个方法的调用堆栈

做鸿蒙开发的时候,也想看一下一个方法到底是哪里调用的,工程太大,断点太麻烦,可以加堆栈日志。 在你的方法中加上这两句,就可以跟到堆栈日志 let err new Error() console.log(>>>>>>err.stack) …

IDE如何安装插件实现Go to Definition

项目背景 框架:Cucumber Cypress 语言:Javascript IDE:vscode 需求 项目根目录cypress-automation的cypress/integration是测试用例的存放路径,按照不同模块不同功能创建了很多子目录,cucumber测试用例.feature文…

如何通过 Windows 自带的启动管理功能优化电脑启动程序

在日常使用电脑的过程中,您可能注意到开机后某些程序会自动运行。这些程序被称为“自启动”或“启动项”,它们可以在系统启动时自动加载并开始运行,有时甚至在后台默默工作。虽然一些启动项可能是必要的(如杀毒软件)&a…

探索自然语言处理奥秘(NLP)

摘要 自然语言处理(NLP)是人工智能领域的一个重要分支,它致力于使计算机能够理解、解释和生成人类语言。这项技术让机器能够阅读文本、听懂语音,并与人类进行基本的对话交流。 通俗理解 自然语言处理(NLP&#xff09…

# issue 8 TCP内部原理和UDP编程

TCP 通信三大步骤: 1 三次握手建立连接; 2 开始通信,进行数据交换; 3 四次挥手断开连接; 一、TCP内部原理--三次握手 【第一次握手】套接字A∶"你好,套接字B。我这儿有数据要传给你,建立连接吧。" 【第二次…

力扣--543.二叉树的直径

题目 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 代码 /** Definition for a binary tree node.public…

在ensp进行IS-IS网络架构配置

一、实验目的 1. 理解IS-IS协议的工作原理 2. 熟练ensp路由连接配置 二、实验要求 需求: 路由器可以互相ping通 实验设备: 路由器router6台 使用ensp搭建实验坏境,结构如图所示 三、实验内容 R1 u t m sys undo info en sys R1 #设…

挑战用React封装100个组件【010】

Hello,大家好,今天我挑战的组件是这样的! 今天这个组件是一个打卡成功,或者获得徽章后的组件。点击按钮后,会弹出礼花。项目中的勋章是我通过AI生成的,还是很厉害的哈!稍微抠图直接使用。最后面…

Mybatis-Plus的主要API

一、实体类操作相关API BaseMapper<T>接口 功能&#xff1a;这是 MyBatis - Plus 为每个实体类对应的 Mapper 接口提供的基础接口。它提供了一系列基本的 CRUD&#xff08;增删改查&#xff09;操作方法。例如insert(T entity)方法用于插入一条记录&#xff0c;d…

C++类与对象(二)

一、默认成员函数 class A{}; 像上面一样&#xff0c;一个什么都没有的类叫做空类&#xff0c;但是这个什么都没有并不是真正的什么都没有&#xff0c;只是我们看不见&#xff0c;空类里面其实是有6个默认成员函数的&#xff0c;当我们在类里面什么都不写的时候&#xff0c;编译…

数据结构与算法-03链表-03

递归与迭代 由一个问题引出 假设我们要计算 一个正整数的阶乘, N! 。 从数学上看 1&#xff01; 1 2&#xff01; 2 x 1 3! 3 x 2 x 1 4! 4 x 3 x 2 x 1 5! 5 x 4 x 3 x 2 x 1 : n! n x (n-1) x (n-2) x (n-3) x ... 1我们推出一般公式 f(1) 1 f(n) n * f(n-1…

spring6:2入门

spring6&#xff1a;2入门 目录 spring6&#xff1a;2入门2.1、环境要求2.2、构建模块2.3、程序开发2.3.1、引入依赖2.3.2、创建java类2.3.3、创建配置文件2.3.4、创建测试类测试2.3.5、运行测试程序 2.4、程序分析2.5、启用Log4j2日志框架2.5.1、Log4j2日志概述2.5.2、引入Log…

汽车IVI中控开发入门及进阶(三十五):架构QML App Architecture Best Practices

在Qt/QML工程的架构中,架构很重要,虽然本身它有分层,比如QML调用资源文件(图片等)显示GUI界面,后面的CPP文件实现界面逻辑,但是这个分类还有点粗。在实际开发中,界面逻辑也就是基于类cpp的实现,也开始使用各种面向对象的设计模式,实现更加优秀的开发架构,这点尤其在…