【Qt】Qt框架文件处理精要:API解析与应用实例:QFile

news2024/12/23 7:05:50

文章目录

  • 前言:
  • 1. Qt 文件概述
  • 2. 输入输出设备类
  • 3. 文件读写类
    • 3.1. 打开open
    • 3.2. 读read / readline/ readAll
    • 3.3. 写write
    • 3.4. 关闭close
  • 4. 读写文件示例
  • 5. 文件件和目录信息类
  • 总结:

前言:

在现代软件开发中,文件操作是应用程序与外部世界交互的基本方式之一。无论是读取用户数据、存储配置信息,还是管理临时文件,文件系统都是不可或缺的一部分。Qt,作为一个功能强大的跨平台开发框架,提供了一套全面的文件操作API,使得开发者能够在不同的操作系统上实现一致的文件处理逻辑。本篇文章将深入探讨Qt中的文件操作,包括文件的打开、读写、关闭,以及文件和目录信息的获取等核心功能。通过详细的代码示例和类介绍,读者将能够理解并掌握Qt文件操作的基本概念和实用技巧。

1. Qt 文件概述

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

2. 输入输出设备类

  • C语言中,fopen 打开文件,freadfwrite 读写文件,fclose 关闭文件
  • C++ 中,fstream 打开文件,<<>> 读写文件,close 关闭文件
  • Linux 中,open 打开文件,readwrite 读写文件,close 关闭文件 (一般开发中很少会直接使用,主要是要理解其背后的原理)

在 Qt 中使用上述的几种方案来读写文件,也是完全可以的。(Linux 这一套,局限于 Linux 系统,Windows 上的 Qt,就需要使用 Windows api) 但是即使如此,Qt还是又封装了一套。 Qt 诞生的太早了,C++还没有“标准化”概念。
咱们在编写 Qt 程序的时候,更推荐使用 Qt 自己提供的这一套文件操作,和QString等 Qt 内置的类可以很好的配合。

Qt中的文件操作,核心操作也是这么几个部分:打开,读,写,关闭。
QFile 类完成,完成上述文件操作。
在这里插入图片描述
QTemporaryFile: 这个对象销毁,对应的文件就自动删除了
QSaveFile: 要写入大量数据,写入文件的时候,往往会把旧的文件先清空再写,万一新的数据写写一般,结果出错了。新的数据用不了旧的数据也无了。

如果你想写一个文件,会自动的把内容写到零时文件里(不会破坏原有的文件)等到所有内容都写完了之后,再把旧文件自动删除,并且用新的文件替换旧的文件。(这种策略是一种个广泛常见)

QSerialPort: 串口一种古老的通信方式,一般是再嵌入式系统上,开发板,通过串口来和开发板之间进行交互。
QProcess: 相当于是对 fork / exec 操作进行封装。
QBuffer:缓冲区

3. 文件读写类

QFile

QFile(const QString &name)

可以是绝对路径,也可以是相对路径

如果在文档中 QFile 中找不到这些,可以在其父类找。

3.1. 打开open

在这里插入图片描述
构造函数中,指定了路径之后,此时直接通过这个版本的 open 打开
在这里插入图片描述
OpenMode: 读方式、写方式、追加写方式…
在这里插入图片描述

3.2. 读read / readline/ readAll

在这里插入图片描述
QByteArry 很方便转成 QString

3.3. 写write

在这里插入图片描述

3.4. 关闭close

在这里插入图片描述
关闭的本质是要释放文件描述符表中的表项;文件描述符表存在上限,如果一直打开,不关闭的话,就可能会使文件描述符表被占满,后续再尝试打开,就打开不了了。

4. 读写文件示例

#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();
}

在这里插入图片描述

QString text = file.readAll();

需要确保打开的文件是一个文本文件才可以,如果是二进制文件,交给 QString 就不合适了。
二进制文件:里面的内容存啥都行,没有限制。图片,可执行程序,音频,视频…
文本文件:里面的内容必须是合法字符(遵守 utf8, gbk 等编码方式)

5. 文件件和目录信息类

QFileInfo 可以获取到 Qt 文件的相关属性。类似于这样的功能,在 C/C++ 标准库中原本是没有的,所以要想使用类似的功能往往要使用系统 api。
C++17 引入了模块,filesystem

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QDebug>
#include <QFileInfo>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_clicked()
{
    // 弹出文件对话框,并获取到文件属性信息
    QString path = QFileDialog::getOpenFileName(this);
    // 构造出一个 QFileInfo 对象
    QFileInfo fileInfo(path);
    // 打印相关属性
    qDebug() << fileInfo.fileName();
    qDebug() << fileInfo.suffix();
    qDebug() << fileInfo.path();
    qDebug() << fileInfo.size();
    qDebug() << fileInfo.isFile();
    qDebug() << fileInfo.isDir();
    // ...
}

在这里插入图片描述
QFileInfo还有很多操作方法:
在这里插入图片描述

总结:

本文详细介绍了Qt框架中关于文件操作的各个方面,从基础的文件读写到文件和目录信息的获取,为开发者提供了一套完整的文件处理解决方案。通过QFile类,我们可以实现文件的打开、读取、写入和关闭等操作,同时QFileInfo类则提供了获取文件属性的便捷方式。文章中提供的代码示例进一步展示了如何在实际的Qt应用程序中应用这些API,帮助开发者快速上手并解决文件操作中可能遇到的问题。

此外,文章还提到了Qt中的一些特殊文件操作类,如QTemporaryFile、QSaveFile、QSerialPort和QProcess等,这些类在特定场景下提供了额外的功能,增强了文件操作的灵活性和安全性。通过本文的学习,开发者不仅能够掌握Qt文件操作的基础,还能够根据不同的应用需求选择合适的工具和方法,提高开发效率和程序的健壮性。

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

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

相关文章

云计算-无服务器计算与AWS Lambda (Serverless Computing with AWS Lambda)

AWS Lambda 无服务器计算与AWS Lambda AWS Lambda支持无服务器计算&#xff0c;不需要任何预配置和管理&#xff0c;同时还能最大限度地降低成本。我们将看到如何创建一个简单的Lambda函数&#xff0c;以及如何将其与AWS事件映射。在现实生活中&#xff0c;任何托管在线的应用…

Eureka全面解析:轻松实现高效服务发现与治理!

一、引言 Eureka是Netflix开源的一款服务发现框架&#xff0c;它提供了一种高效的服务注册和发现机制&#xff0c;适用于大规模分布式系统。本文将详细介绍Eureka的相关知识。 二、Eureka简介 Eureka是一个基于REST的服务发现框架&#xff0c;它提供了一种简单的服务注册和发…

签到打卡页面如何设计?

设计一个UI签到打卡页面时&#xff0c;以下是一些建议和注意事项&#xff1a; 页面布局&#xff1a;将签到打卡按钮放置在页面的显眼位置&#xff0c;以便用户快速找到。可以考虑将其他相关信息&#xff0c;如签到日期、时间、地点等也显示在页面上&#xff0c;以增加用户的参…

Modbus工业网关

随着工业自动化程度的不断提高&#xff0c;设备之间的数据通信与交互变得至关重要。在这一背景下&#xff0c;Modbus协议凭借其简单、可靠、开放的特点&#xff0c;成为了工业自动化领域中最常用的通信协议之一。而HiWoo Box网关作为一款支持Modbus协议的工业网关设备&#xff…

C++ std::reference_wrapper:让引用更强大

std::reference_wrapper 的通俗易懂解释 一、简介二、std::reference_wrapper 的初衷三、常用示例3.1、与 make_pair 和 make_tuple 一起使用3.2、引用容器3.3、通过 std::thread 按引用传递参数给启动函数3.4、引用作为类成员3.5、按引用传递函数对象3.6、与绑定表达式一起使用…

Megatron-LM源码系列(八): Context Parallel并行

1. Context Parallel并行原理介绍 megatron中的context并行(简称CP)与sequence并行(简称SP)不同点在于&#xff0c;SP只针对Layernorm和Dropout输出的activation在sequence维度上进行切分&#xff0c;CP则是对所有的input输入和所有的输出activation在sequence维度上进行切分&…

「小明赠书活动」第四期《Java开发坑点解析:从根因分析到最佳实践》

⭐️ 赠书 - 《Java开发坑点解析&#xff1a;从根因分析到最佳实践》 这是一本帮助Java开发人员规避常见错误的书。从业务代码开发、项目技术设计、代码安全3个层面剖析150多个常见坑点。 业务代码开发层面&#xff0c;近20个方面的坑&#xff0c;涉及多线程、数据访问、池技术…

【VTKExamples::Utilities】第四期 CameraModifiedEvent

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例CameraModifiedEvent,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. CameraModifi…

521源码-免费音乐源码-最新流媒体在线音乐系统网站源码| 英文版源码| 音乐社区 | 多语言 | 开心版

免费音乐源码 一键自动安装&#xff1a;安装用翻译看提示操作即可 本源码下载地址&#xff1a;最新流媒体在线音乐系统网站源码| 英文版源码| 音乐社区 | 多语言 | 开心版 - 521源码 更多网站源码学习教程&#xff0c;请点击&#x1f449;-521源码-&#x1f448;获取最新资源…

APM2.8如何供电

APM2.8飞控供电有两种&#xff0c; 1.电流计供电&#xff0c; 2.带BEC&#xff08;稳压功能&#xff09;的电调供电 飞控有一个JP1&#xff0c;它是一个供电选择接口&#xff0c;当插入跳线帽时&#xff0c;飞控用带BEC电调供电&#xff0c;当不插入时&#xff0c;用电流计供…

基于springboot的论坛管理系统(含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的论坛管理系统3拥有两种角色 管理员&#xff1a;用户管理、公告管理、帖子管理、分类管理、留言管理、系统管理等 用户&#xff1a;登录注册、查看发布帖子等 1.1 背景…

深度学习论文: YOLOv10: Real-Time End-to-End Object Detection

深度学习论文: YOLOv10: Real-Time End-to-End Object Detection YOLOv10: Real-Time End-to-End Object Detection PDF: https://arxiv.org/pdf/2405.14458 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://github.com/shanglianlm0525/PyTo…

如何评价 OpenAI 最新发布支持实时语音对话的模型GPT-4o?OpenAI发完GTP-4o,国内大模型行业还有哪些机会?

文章目录 OpenAI发完GTP-4o&#xff0c;国内大模型行业还有哪些机会&#xff1f;详细了解一下OpenAI最新发布的支持实时语音对话的模型GPT-4o国内大模型如何寻找发展机会&#xff1f;想要发展技术必须要创新与追赶或许应用场景拓展也是一种出路产业生态构建 ChatGPT 问世才 17 …

隆道专属商城 | 助力企业跨平台整合优势资源,解决采购寻源比价难题!

数字化采购时代&#xff0c;企业面临着日益激烈的市场竞争&#xff0c;如何优化资源配置、降低采购成本、提高采购效率成为企业追求的核心目标。当前&#xff0c;网上商城凭借其强大的供应链资源整合能力&#xff0c;为企业内部采购商城的搭建提供了独特的优势&#xff0c;已然…

【Lexus.4】Executive Sedan——Dismantling Follow-up

文章目录 【碰撞测试】前后防撞钢梁偏置碰撞A/B/C柱&#xff0c;边梁抗拉、屈服强度 【底盘】平整度护板&#xff08;发动机&#xff0c;底盘&#xff09;前副车架结构前悬架形式后悬架形式与材质簧下质量 【发动机】【轮上马力】【零部件供应商】 来自2021《懂车大爆炸》——是…

网络风暴:揭秘DDoS攻击的幕后黑手

在数字化时代的浪潮中&#xff0c;网络攻击已成为一种新型的战争手段。其中&#xff0c;分布式拒绝服务攻击&#xff08;DDoS&#xff09;以其强大的破坏力和隐蔽性&#xff0c;成为网络安全领域的一大挑战。DDoS攻击通过发动海量的恶意流量&#xff0c;如同狂风暴雨般席卷目标…

Springboot项目——博客平台

前言&#xff1a;为巩固之前学习的知识&#xff0c;同时锻炼自己的代码能力&#xff0c;项目经验&#xff0c;熟悉前后端交互方式等&#xff0c;特此完成一个博客平台系统。&#xff08;总之&#xff0c;为了学习&#xff0c;为了进步&#xff09; 博客平台&#xff1a;本项目…

干货|图生代码实例整理,让你的代码更高效

前言 “图生代码”。这项新功能允许开发人员直接利用产品设计图一键生成相应的代码&#xff0c;极大地提高了编程效率和研发速度。甚至会未来软件开发可能迎来一场革命性的变革。但图生代码究竟能直到什么程度&#xff1f;本文结合一款图生代码的实例程序整理了一些有代表意义…

如何在 DigitalOcean Droplet 云主机上创建 Ubuntu 服务器

在本文中&#xff0c;你将通过 DigitalOcean 的管理面板创建一个 Ubuntu 服务器&#xff0c;并将其配置为使用你的 SSH 密钥。设置好服务器后&#xff0c;你可以在其上部署应用程序和网站。 本教程是DigitalOcean云课程简介的一部分&#xff0c;它指导用户完成将应用程序安全地…

期望薪资30k字节java2面,A给B转账的同时B给A转账怎么并发量最高

一面 1、自我介绍 2、详细介绍一下自己的做的项目&#xff1f;根据项目提了一些问题 3、hashmap原理 4、B树原理&#xff1f; 5、final禁止重排序原理&#xff1f; 6、设计一个榨汁机类&#xff0c;面向对象怎么设计&#xff1f; 7、get、post区别&#xff0c;使用场景&…