【Qt教程】4.1 - Qt5 文件系统 QFile文件读写操作

2023-11-06

1. Qt文件系统简介 - QFile

文件系统是应用程序必不可少的部分。Qt作为一个通用开发库,提供了跨平台的文件操作能力。Qt通过 QIODevice 提供了对I/O设备的抽象,使这些设备具有读写字节块的能力。

在所有的I/O设备中,文件I/O是最重要的部分之一。QFile提供了从文件中读取和写入数据的能力。我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象后,使用 setFileName()来修改。

QFile 主要提供了有关文件的各种操作,比如打开文件、关闭文件、刷新文件等。我们可以使用 QDataStream或 QTextStream类来读写文件,也可以使用 QIODevice类提供的 read()、readLine()、readAll()以及 write()这样的函数。值得注意的是,有关文件本身的信息,比如文件名、文件所在目录的名字等,则是通过 QFileInfo获取,而不是自己分析文件路径字符串。

GitHub源码仓库:Qt学习例程

 

2. 示例需求及流程

  • 需求:新建QWidget工程,创建这样一个界面工程。选择文件后,会将文件路径显示到 lineEdit里,并且将文档内容显示在 textEdit中。

 

例程功能执行过程

按键关联消息槽,弹出文件对话框,打开文件,输出路径。

读内容有两种方式:(默认utf-8,可以指定格式gbk,不过很麻烦。)

  • file.readAll();,全部读取

  • file.readLine();,按行读,读到文件行尾。

打开后,别忘记关闭文件对象。

写文件。

按照指定的日期时间格式,输出文件创建日期 和最后修改日期。

 

打开文件的方式:

 

日期时间的格式编码方法:

 

 

3. 示例源码、现象

GitHub源码仓库:Qt学习例程

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QDebug>
#include <QTextCodec>
#include <QDateTime>

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

    // 点击选取文件按钮,弹出文件对话框
    connect(ui->pushButton, &QPushButton::clicked, [=](){

        // 用打开的方式打开一个文件对话框
        // 打印选中该的路径名称。参数:父对象,对话框标题,默认打开路径,过滤的文件格式
        QString path = QFileDialog::getOpenFileName(this, "open",
                                                    "../",
                    "Text(*.txt);;souce(*.cpp *.h);;all(*.*)");
        // 调试输出选择路径
        qDebug() << path;
        // 将路径显示到 lineEdit
        ui->lineEdit->setText(path);

        // 指定操作文件格式,只能指定一种格式,所以指定gbk时读utf-8的会出错
        //QTextCodec * codec = QTextCodec::codecForName("gbk");

        // 读取txt内容,放入到 textEdit中
        // QFile默认支持的格式是 utf-8
        // 输入打开文件的文件路径
        QFile file(path);
        // 打开方式:只读/只写/读写/追加
        file.open(QIODevice::ReadOnly);

        // 全部读取
        //QByteArray array = file.readAll();
        // 按行读,追加到array,直到读到行尾
        QByteArray array;
        while(!file.atEnd())
        {
            array += file.readLine();
        }

        ui->textEdit->setText(array);
        //ui->textEdit->setText(codec->toUnicode(array));

        // 关闭文件对象
        file.close();

        // 用追加方式进行写文件
        /*file.open(QIODevice::Append);
        file.write("aaaaaaaaa");
        // 关闭文件对象
        file.close();*/

        // QFileInfo 文件信息类
        QFileInfo info(path);
        qDebug() << "大小:" << info.size() << "Bytes 后缀名:" << info.suffix()
                 << " 文件名称:" << info.fileName() << " 文件路径:" << info.filePath();
        // 显示 创建日期
        qDebug() << "创建日期:" << info.created().toString("yyyy/MM/dd hh:mm:ss");
        qDebug() << "创建日期:" << info.birthTime().toString("yyyy/MM/dd hh:mm:ss");
        // 显示 最后修改日期
        qDebug() << "最后修改日期:" << info.metadataChangeTime().toString("yyyy/MM/dd hh:mm:ss");
        qDebug() << "最后修改日期:" << info.lastModified().toString("yyyy/MM/dd hh:mm:ss");
    });
}

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

 

 

文件对话框选择目录中的.txt文档,结果如下:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Qt教程】4.1 - Qt5 文件系统 QFile文件读写操作 的相关文章

  • 井字游戏代码有助于改进

    这是我必须检查玩家在井字棋游戏中获胜的代码 这是一个很长的 if 语句 可以改进 该板由 9 个图片框组成 我是一名 C 初学者 pBox Image Player players Player playerTurn getImage ch
  • lambda 表达式到函数指针的转换

    这是这个问题的后续问题 Lambda 如何作为参数传递 https stackoverflow com questions 3321283 c0x lambda how can i pass as a parameter 据推测 MSDN
  • 如何在C中将2个4位无符号数组合成1个8位数

    我有 2 个 4 位数字 X0X1X2X3 和 Y0Y1Y2Y3 我想将它们组合起来 这样我就可以创建一个像这样的 8 位数字 X0X1X2X3 Y0Y1Y2Y3 gt X0Y0X1Y1X2Y2X3Y3 我知道如何连接它们以创建X0X1X1
  • .NET Core 2 - 从启动中调用存储库方法[重复]

    这个问题在这里已经有答案了 我有以下存储库和类 public interface IValueService GetAll public class ValueService IValueService private DataContex
  • 公共领域有哪些替代方案?

    我正在用 java 编写一个游戏 正如问题标题建议的那样 我在类中使用公共字段 暂且 据我所知 公共领域很糟糕 我有一些理解其中的原因 但如果有人能澄清为什么你不应该使用它们 那将不胜感激 问题是 从我所看到的来看 这似乎是合乎逻辑的 是使
  • 如何使用 DesignData 帮助开发 Metro 应用程序?

    我一直在 Windows Phone 应用程序中愉快地使用 DesignData 我希望使用它来帮助在 VS2012 Blend for VS 中的 Metro 风格应用程序中可视化设计 我已经尝试过希望显而易见的方法
  • C++ 为非虚方法指定初始化

    我有 a h 如下所示 class A public void doSomething 0 然后我有 b h 如下所示 include a h class b public A public void doSomething 我只是想通过尝
  • 如何在C中递归地找到另一个字符串中的字符串位置?

    我们有一个任务来创建带有两个字符串参数的递归函数 原型应该是这样的 int instring char word char sentence 如果我们愿意调用函数 instring Word Another Word 它应该具有以下返回值
  • 模板“内联”函数的静态局部变量[重复]

    这个问题在这里已经有答案了 static的局部变量inline如果我的理解是正确的 C 中的函数保证像单个全局变量一样存在 如果inline函数是一个模板 编译器可以在哪里生成该函数的多个版本 下面这篇文章应该很好地回答你的问题 http
  • 使用 INF 文件 C++ 以编程方式安装驱动程序

    这里有人可以告诉我如何安装第 3 方设备驱动程序吗 如果提供了所有必需的文件 即 inf 文件 sys 等 则以编程方式进行 这 该解决方案应运行的最低操作系统是Windows2000 我尝试复制 inf文件放入Win文件夹 INF文件夹和
  • 尝试缓冲区溢出

    我正在尝试使用缓冲区溢出来更改函数的结果 以使用以下代码更改堆栈上的结果 include
  • 如何在 .NET 中自定义 JSON 枚举的反序列化?

    我有以下示例 C 代码 它是使用 svcutil exe 应用程序从 xsd 自动生成的 DataContract public enum Foo EnumMember Value bar Bar 1 EnumMember Value ba
  • 如何修改 edmx 的默认代码生成策略?

    我想修改默认的代码生成策略 该怎么做 我只是想修改类名 lt code Escape container gt to Entities并将默认连接字符串更改为name Default 我不想为该项目创建模板文件 我想编辑它以便它可以在全球范
  • C++20 views::join 在生成的嵌套范围::single_view 上进入无限循环

    我正在使用 GCC 实现 v10 2 和 v11 来处理 C 20 范围 测试的行为std views join https en cppreference com w cpp ranges join view 我尝试使用生成嵌套视图sin
  • 为什么 C++ 元组如此奇怪?

    我通常创建自定义structs将不同类型的值分组在一起时 这通常很好 而且我个人发现命名成员访问更容易阅读 但我想创建一个更通用的 API 在其他语言中广泛使用元组后 我想返回类型的值std tuple但发现它们在 C 中使用比在其他语言中
  • 我的 Opencv 应用程序处理速度非常慢

    我正在构建一个 OpenCV 应用程序 它从相机捕获视频 并在删除背景后将其覆盖在另一个视频上 我无法达到合理的速度 因为它以大约 1 fps 的速度播放输出 而我的背景去除以 3 fps 的速度工作 有没有办法以正常速度显示背景视频并以
  • QPainterPath::arcTo 上的角度如何解释?

    我正在开发图形编辑器的功能 在其中编辑弧线 当形状是椭圆形时 QPainterPath arcTo 的行为并不像我预期的那样 当它是一个圆圈时 它会按预期工作 下面的两张图片显示了结果 在第一种情况下 我创建了一个圆 然后将其转换为初始起始
  • PyQt 和 QSignalMapper/lambdas - 多个信号,单槽

    我在 PyQt 的菜单上有一个操作列表 每个操作对应我想要显示的每个不同的提要 所以我有一个 Y 将活动源设置为 Y Z 将其设置为 Z 等等 对于网络漫画阅读程序 我的菜单上都有 并且觉得自动化方法可能更好 而不是每次都打字 类似于将其添
  • Lambda 按值捕获和“mutable”关键字

    关键词的必要性mutable在 lambda 中 是造成极大混乱的根源 考虑代码 int x 10 function
  • “while(true) { Thread.Sleep }”的原因是什么?

    我有时会遇到以下形式的代码 while true do something Thread Sleep 1000 我想知道这是否被认为是好的做法还是坏的做法以及是否有任何替代方案 通常我在服务的主函数中 找到 这样的代码 我最近在 Windo

随机推荐

  • Leetcode剑指Offer学习计划第二天题目

    剑指 Offer 06 从尾到头打印链表 输入一个链表的头节点 从尾到头反过来返回每个节点的值 用数组返回 示例 1 输入 head 1 3 2 输出 2 3 1 限制 0 lt 链表长度 lt 10000 所给代码如下 1 Definit
  • Charm-crypto搭建CP-ABE密码系统

    在做毕业设计 所以顺便把做的实验总结成文章 CP ABE原理 另一篇文章总结了 搭建CP ABE系统 注意必须先确保正确安装了Charm crypto环境 安装比较坑 可以根据我的文章安装 https blog csdn net qq 33
  • Visual studio系统找不到指定文件的解决办法

    前言 系统找不到指定文件是新手常见的问题 鉴于笔者是rookie dog也花了好长时间 所以我也就只给我的解决方法啦 这个行不通的师傅可以去网上再搜索一下 或者咨询一下身边的大师傅们问问他们的经验 心态别崩 能解决的 一 问题概述 具体情形
  • [Unity教程]unity 鼠标点击目的地生成特效

    像 很多游戏 点击 目的地 就会在目的地 生成一个 特效 让玩家能够 明白自己点击的地方是哪里 怎么做呢 Unity 的官方 标准 示例 或许可以解决 这个问题 在Unity 的安装中 勾选 如下图所示的2个 选项 进行安装 安装完毕后 打
  • 怎么去除百度网盟推广广告

    1 浏览器 工具 Internet选项 2 安全 受限制的站点 站点 3 把 cpro baidustatic com cpro baidu com 两个域名添加到受限制的站点里 4 添加好了之后 点击确定 关闭浏览器 这样再次搜索就不会出
  • 探亲问题(无向图任意两点是否可连通)——C语言

    下提供队列实现的代码 include
  • Microsoft Dynamics的五种关键能力

    1 集成通信与协作 您需要在工程部门 制造部门和分包商间进行同步通信 例如 如果工程部门改变了设计 运营部门应该立即知道有关的详细情况 您的通信解决方案需要同 ERP 系统相集成 以确保分包商能够支持工程部门在敏捷性方面的提高 产品数据管理
  • 集成开发环境:IDE

    集成开发环境 IDE IDE Integrated Development Environment 是用于提供程序开发环境的应用程序 一般包括代码编辑器 编译器 调试器和图形用户界面等工具 集成了代码编写功能 分析功能 编译功能 调试功能等
  • 机器学习(2)——鸢尾花数据集

    在上次房价数据集中做出一些改进 对鸢尾花数据集进行预测 需要导入的库 from sklearn datasets import load iris 导入鸢尾花数据集 from sklearn linear model import Logi
  • spark安装运行在webUI界面不显示worker

    spark conf spark env sh 文件中需要显式地设置一些环境变量 不用系统默认值 亲测 ubuntu16 04系统 spark env sh中手动配置 export JAVA HOME lt gt jdk1 8export
  • 33. 实战:实现某网站店铺信息的查询与批量抓取(附源码)

    目录 前言 目的 思路 代码实现 1 请求URL 获取源代码 2 解析源代码 获取数据 3 完善保存数据的函数save data 4 理清main函数逻辑 循环传递每一页有效信息的参数 完整代码 运行效果 总结 前言 近日 我们每周四都能刷
  • C#类与结构体的区别

    C 中类 class 与结构体 stract 的区别 1 类是引用类型 结构体是值类型 2 结构体不支持继承 但可以实现接口 类即支持继承也能实现接口 3 结构体中不可以声明无参的构造函数 4 结构体不能定义析构函数 5 结构体不可用作其他
  • 关于json数据的写入(write())必须为str类型及写入后双引号“变为‘号问题

    1 原始json数据 text 黎城县东崖底中心校学生用床购置项目成交公告 label 1 duoyu 0 text 淮南师范学院采购2017年智库项目 科研建设项目 学科及科技创新平台项目 1包 中标公示 label 1 duoyu 0
  • SpringBoot对接微信小程序支付功能开发(二,支付回调功能)

    接着上一篇 SpringBoot对接微信小程序支付功能开发 一 下单功能 在上一篇下单功能中我们有传支付结果回调地址 下面是回调接口实现 package com office miniapp controller import cn hut
  • Blender材质贴图入门图文教程

    推荐 将 NSDT场景编辑器 加入你的3D开发工具链 大家好 今天跟大家分享Blender材质贴图入门图文教程 一套blender的PBR材质包 和HDRI环境纹理贴图 在文末领取 希望能助到大家更高效完成场景练习 据我了解 越来越多人开始
  • Redis、Redission实现分布式锁

    Redis实现 使用spring data redis提供的接口实现redis分布式锁
  • kali使用aircrack无线攻击wifi超详细步骤(包含监听网卡启动,获得握手包,密码本生成)

    平台及工具 linux kali平台 aircrack ng 工具 免驱监听网卡 详细操作 1 首先启动kali 插入网卡 输入ifconfig查看kali是否检测到监听网卡 注意监听网卡要免驱动的 ifconfig 查看自身网卡信息 如图
  • React lazyLoad懒加载

    在React中使用lazy懒加载 效果图 目录结构 index js import React from react import ReactDOM from react dom import App from App import Bro
  • PID算法与PID自整定算法

    PID算法与PID自整定算法 本文是由于研发恒温槽项目故需要了解PID控制算法和PID自整定算法 为方便本人日后需要故作此记录 直接粘贴代码吧 这是PID位置式控温算法 函数名 void Pid positional float speed
  • 【Qt教程】4.1 - Qt5 文件系统 QFile文件读写操作

    1 Qt文件系统简介 QFile 文件系统是应用程序必不可少的部分 Qt作为一个通用开发库 提供了跨平台的文件操作能力 Qt通过 QIODevice 提供了对I O设备的抽象 使这些设备具有读写字节块的能力 在所有的I O设备中 文件I O