【QT系统相关】QT文件

目录

1. Qt 文件概述

2. 输入输出设备类

3 文件读写类

读取文件内容

写文件

实现一个简单的记事本

4. 文件和目录信息类


QT专栏:QT_uyeonashi的博客-CSDN博客

1. Qt 文件概述

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

2. 输入输出设备类

在 Qt 中,文件读写的类为 QFile 。QFile 的父类为 QFileDevice ,QFileDevice 提供了文件交互操作的底层功能。 QFileDevice 的父类是 QIODevice,QIODevice 的父类为 QObject 。
QIODevice 是 Qt 中所有输入输出设备(input/output device,简称 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 类中提供了多个方法用于往文件中写内容;如 write()、writeData()等。
• 关闭文件:文件使用结束后必须用函数 close() 关闭文件。
访问一个设备之前,需要使用 open()函数 打开该设备,而且必须指定正确的打开模式,QIODevice 中所有的打开模式由 QIODevice::OpenMode 枚举变量定义,其取值如下:

读取文件内容

1. 新建 Qt 项目,在 UI 文件中拖入一个 LineEdit,一个pushButton,一个 TextEdit。当点击按钮时,弹出窗口选择要读取的文件,并将读取到的内容在 TextEdit 中显示;

2. 在 "widget.cpp" 文件中实现对应功能;

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->btn,&QPushButton::clicked,[=](){QString path = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\Lenovo\\Desktop");ui->lineEdit->setText(path);QFile file(path); //path:代表文件路径this//打开文件file.open(QIODevice::ReadOnly); //以只读的方式打开文件QString str = file.readAll();ui->textEdit->setText(str);//关闭文件file.close();});
}

写文件

在上述示例的基础上修改 "widget.cpp" 文件;

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->btn,&QPushButton::clicked,[=](){QString path = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\Lenovo\\Desktop");ui->lineEdit->setText(path);QFile file(path); //path:代表文件路径//打开文件 进行写操作file.open(QIODevice::Append); //以追加的方式进行写file.write("【这是示例!!!】");//关闭文件file.close();});
}

 

实现一个简单的记事本

//  mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPlainTextEdit>
#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);connect(action1,&QAction::triggered,this,&MainWindow::handleAction1);connect(action2,&QAction::triggered,this,&MainWindow::handleAction2);}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::handleAction1()
{   //打开文件,选择打开哪个文件QString path = QFileDialog::getOpenFileName(this);//把文件名显示到状态栏QStatusBar* statusBar = this->statusBar();statusBar->showMessage(path);//根据选择的路径构建QFIle对象,并打开文件QFile file(path);bool ret = file.open(QFile::ReadOnly);if(!ret){statusBar->showMessage(path + "打开失败");return;}//读取文件QString text = file.readAll();file.close();//对到的内容设置到输入框中edit->setPlainText(text);
}void MainWindow::handleAction2()
{   //保存文件QString path = QFileDialog::getSaveFileName(this);//在状态栏中显示这个文件名QStatusBar* statusBar = this->statusBar();statusBar->showMessage(path);//根据选择路径,构建QFile对象,并打开文件QFile file(path);bool ret = file.open(QFile::WriteOnly);if(!ret){statusBar->showMessage(path + "打开失败");return;}//写文件const QString& text = edit->toPlainText();file.write(text.toUtf8());file.close();
}

 

4. 文件和目录信息类

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

示例:
在 "widget.cpp" 文件中添加如下代码:

#include <QFileInfo>
#include <QFileDialog>
#include <QDebug>
#include <QDateTime>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->btn,&QPushButton::clicked,[=](){QString path = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\Lenovo\\Desktop");//QFileInfo 文件信息类QFileInfo fileinfo(path);//文件名qDebug() << "文件名为:" << fileinfo.fileName().toUtf8().data();//文件后缀名qDebug() << "后缀名为:" << fileinfo.suffix().toUtf8().data();//文件大小qDebug() << "文件大小为:" << fileinfo.size();//文件路径qDebug() << "文件路径为:" << fileinfo.path().toUtf8().data();//判断是否为文件qDebug() << "是否为文件:"<< fileinfo.isFile();//文件创建时间QDateTime time1 = fileinfo.fileTime(QFileDevice::FileBirthTime);qDebug() << "创建时间为:" << time1.toString("yyyy-MM-ddhh:mm:ss").toUtf8().data();//文件的最后修改日期QDateTime time2 = fileinfo.lastModified();qDebug() << "最后修改时间为:"<< time2.toString("yyyy-MM-ddhh:mm:ss").toUtf8().data();//判断是否为文件夹qDebug() << "是否为目录:" << fileinfo.isDir();});
}


本篇完!

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

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

相关文章

爱普生RX8111CE实时时钟模块在汽车防盗系统中的应用

在汽车智能化与电子化的发展浪潮中&#xff0c;汽车防盗系统是现代汽车安全的重要组成部分&#xff0c;其核心功能是通过监测车辆状态并及时发出警报来防止车辆被盗或被非法操作。爱普生RX8111CE实时时钟模块凭借其高精度、低功耗和丰富的功能&#xff0c;能够为汽车防盗系统提…

SQL注入攻击原理与防御全解析

目录 一、引言 二、SQL 注入原理 2.1 SQL 注入的概念 2.2 SQL 注入产生的原因 2.3 SQL 注入的本质 2.4 SQL 注入的关键点 三、SQL 注入的实现方法 3.1 常见的 SQL 注入场景 3.2 不同类型的 SQL 注入方式 3.3 SQL 注入的一般流程 四、SQL 注入的危害 4.1 数据泄露 …

写实交互数字人:赋能消防知识科普,点亮智能交互讲解新未来

在数字化浪潮席卷全球的今日&#xff0c;科技创新以前所未有的速度重塑着我们的生活方式与产业格局。消防知识科普&#xff0c;作为守护生命财产安全的关键防线&#xff0c;也亟待借力新兴技术实现变革与突破。深声科技以其行业领先的 2D 写实交互数字人技术&#xff0c;为消防…

用 HTML、CSS 和 JavaScript 实现五子棋人机对战游戏

引言 在 Web 开发的世界里&#xff0c;通过 HTML、CSS 和 JavaScript 可以创造出各种各样有趣的互动游戏。今天&#xff0c;我们将深入探讨如何实现一个简单而又富有挑战性的五子棋人机对战游戏。这个游戏不仅能让你重温经典的五子棋玩法&#xff0c;还能通过 AI 对战功能给你…

【QT】自动更新库QSimpleUpdater使用实例封装

【QT】自动更新库QSimpleUpdater使用实例封装 QSimpleUpdater 库信号介绍appcastDownloaded 信号downloadFinished信号概括 参数介绍 实例编写 QSimpleUpdater 库 QSimpleUpdater是一个用于QT的开源自动更新库&#xff0c;它可以帮助开发者实现应用程序的版本检查和自动更新功…

Nginx、CDN、 DNS的关系解析

文章目录 Nginx 与 CDN 的关系1. 角色定位2. 协作方式3. 自建 CDN vs. 第三方 CDN Nginx 与 DNS 的关系1. 角色定位2. 协作方式3. 性能优化 CDN 与 DNS 的关系1. 角色定位2. 协作方式3. 高级 DNS 技术 三者结合的典型架构总结 Nginx、CDN 和 DNS 是现代网络架构中的三个关键组件…

PH热榜 | 2025-06-13

1. Flowstep 标语&#xff1a;借助人工智能&#xff0c;瞬间设计出美观的用户界面。 介绍&#xff1a;Flowstep 是您的 AI 设计助手&#xff0c;将简单的文字提示转化为用户界面设计、线框图和流程图。它能加速您的工作流程&#xff0c;让您轻松迭代&#xff0c;内置建议帮助…

Spectacular AI Gemini2 跑通实时建图

参考链接&#xff1a;Spectacular AI 硬件设备 gemini2 测试了gemini335没成功 修改record.cpp 仓库链接&#xff1a;sdk 读取Timu_cam ros2 run tf2_ros tf2_echo imu坐标系&#xff08;加速度计和陀螺仪都可以&#xff0c;两者变换为单位阵&#xff09;camera_rgb_optic…

简析MDM在餐饮设备中的部署与应用

引言&#xff1a;科技驱动餐饮运营升级 在竞争激烈的餐饮行业&#xff0c;科技已成为提升服务质量和运营效率的关键。从自助点餐机、数字菜单牌&#xff0c;到移动收银系统&#xff0c;智能设备已经深入餐厅的日常运营。然而&#xff0c;随着设备数量和种类的增加&#xff0c;…

RocketMQ总结

深入理解RocketMQ三高架构设计 高性能 顺序写磁盘 mmap 零拷贝异步刷盘 刷盘策略可配置轻量网络协议 长连接复用 高可用 主从复制机制、controller、dledger集群NameServer 多副本无状态客户端自动切换 Broker消息刷盘机制保障可靠性 高可扩展性 Broker 水平扩展Consu…

vue3+tdesign实现明暗主题切换

很多项目中有些会涉及到明暗主题切换的功能&#xff0c;今天就来梳理一下有关这方面的具体实现步骤和使用到的方法&#xff0c;本篇文章使用到的组件是tdesign&#xff0c;利用部分案例&#xff0c;主要阐述明暗主题切换的技术原理和实现步骤&#xff0c;仅供参考。 目录 一、…

goland 的 dug 设置

brew install delve # 或通过go install go install github.com/go-delve/delve/cmd/dlvlatestwhere dlvdlv.path/your/path/to/dlv环境变量 DEPLOY_MODEprivate;EGO_DEBUGtrue;EGO_MODEdev;MO_MODEdev;PD_MODEco;PRODUCT_MODEall

CVE-2020-1938源码分析与漏洞复现(Tomcat 文件包含/读取)

漏洞概述 漏洞名称&#xff1a;Tomcat AJP协议文件包含/读取漏洞&#xff08;Ghostcat&#xff09; CVE 编号&#xff1a;CVE-2020-1938 CVSS 评分&#xff1a;9.8 影响版本&#xff1a; Apache Tomcat 6.x (≤ 6.0.53)Apache Tomcat 7.x (≤ 7.0.99)Apache Tomcat 8.x (≤ 8…

基于51单片机的简易打铃系统

目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体功能&#xff1a; &#xff08;1&#xff09;实时显示当前时间&#xff08;时、分、秒&#xff09;&#xff0c;LED模式指示灯亮&#xff1b;4个按键可以调整时间的时和分。 &#xff08;2&…

vue+cesium示例:3D热力图(附源码下载)

接到一位知识星友的邀请&#xff0c;随机模拟三维数据点&#xff0c;结合heatmap.js实现基于cesiumvue的3D热力图需求&#xff0c;适合学习Cesium与前端框架结合开发3D可视化项目。 demo源码运行环境以及配置 运行环境&#xff1a;依赖Node安装环境&#xff0c;demo本地Node版本…

批处理实现:自动抓取perfetto日志 自动导出到当前文件夹 自动打开分析页面

序言 最近在研究性能问题需要抓取trace文件。于是写了个脚本 使用 双击运行批处理文件&#xff0c;可以开始记录trace。而且以当前文件夹下面的。config.pbtx 作为配置文件。 &#xff08;pbtx就是一个json文件。配置了需要抓取那些参数&#xff0c;可以通过https://ui.per…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

​​Promise代码理解

1.事件循环与 Promise 执行顺序 案例 1&#xff1a;基础 Promise 同步异步区分 console.log(1); new Promise(resolve > {console.log(2);resolve();console.log(3); }).then(() > console.log(4)); console.log(5); 输出顺序&#xff1a;1&#xff0c;2&#xff0c;3…

57、原生组件注入-【源码分析】DispatcherServlet注入原理

57、原生组件注入DispatcherServlet注入原理 #### 继承关系 - DispatcherServlet继承自FrameworkServlet&#xff0c;而FrameworkServlet继承自HttpServletBean&#xff0c;最终HttpServletBean继承自HttpServlet。 - DispatcherServlet实现了ApplicationContextAware接口。 …

【动手学深度学习】3.5. 图像分类数据集

目录 3.5. 图像分类数据集1&#xff09;读取数据集2&#xff09;读取小批量3&#xff09;整合所有组件4&#xff09;小结 . 3.5. 图像分类数据集 我们将使用Fashion-MNIST数据集&#xff0c;作为图像分类数据集。 %matplotlib inline import torch import torchvision from …