<Qt> 系统 - 文件

news2024/9/22 1:45:21

目录

一、Qt文件概述

二、输入输出设备类

三、文件读写类

四、文件和目录信息类


一、Qt文件概述

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

二、输入输出设备类

在 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 设备来读写。

三、文件读写类

在 Qt 中,文件的读写主要是通过 QFile 类来实现。在 QFile 类中提供了一些用来读写文件的方法。对于文件的操作主要有:

  • 读数据:QFile 类中提供了多个方法用于读取文件内容;如 read()、readAll()、readLine() 等。
  • 写数据:QFile 类中提供了多个方法用于往文件中写内容;如 write()、writeData() 等。
  • 关闭文件:文件使用结束后必须⽤函数 close() 关闭文件。

访问一个设备之前,需要使用 open() 函数 打开该设备,而且必须指定正确的打开模式,QIODevice 中所有的打开模式由 QIODevice::OpenMode 枚举变量定义,其取值如下:

QIODevice::NotOpen没有打开设备
QIODevice::ReadOnly以只读方式打开设备
QIODevice::WriteOnly以只写方式打开设备
QIODevice::ReadWrite以读写方式打开设备
QIODevice::Append以追加方式打开设备,将数据写到文件末尾
QIODevice::Truncate每次打开文件后重写文件内容,原内容将被删除
QIODevice::Text

读文件时,行尾终止符会转换为'\n'

写文件时,行尾终止符会被转换为本地编码。如Win32上为'\r\n'

QIODevice::Unbuffered无缓冲形式打开文件,绕过设备中的任何缓冲区
QIODevice::NewOnly文件存在则打开失败,不存在则创建文件

代码示例:简易记事本

在 "mainwindow.h" 文件中声明edit成员和两个方法:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPlainTextEdit>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

先在QPlainTextEdit中输入一些内容,点击文件再点击保存,保存到指定路径,输入文件名,这样就保存成功了。关闭程序,再次运行,这次输入框中什么也没有,点击文件再点击打开,找到刚才保存的文件,这样就打开成功了。

四、文件和目录信息类

QFileInfo 是 Qt 提供的⼀个⽤于获取⽂件和⽬录信息的类,如获取⽂件名、⽂件⼤⼩、⽂件修改⽇期等。

常用方法:

常用方法说明
isDir()检查该⽂件是否是⽬录
isExecutable()检查该⽂件是否是可执⾏⽂件
fileName()获得⽂件名
completeBaseName()获取完整的⽂件名
suffix()获取⽂件后缀名
completeSuffix()获取完整的⽂件后缀
size()获取⽂件⼤⼩
isFile()判断是否为⽂件
fileTime()获取⽂件创建时间、修改时间、最近访问时间等

在C++17标准库中引入了filesystem文件系统库来获取文件和目录的信息

示例代码:获取文件信息

#include <QFileInfo>

void MainWindow::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();
    // ...
}

点击按钮,选择文件进行查看:

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

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

相关文章

Linux centos stream 9命令及源码

学过linux操作系统的人,对文件、命令比较熟悉。最多的操作是用命令处理文件。 随着学习的深入,会提出疑问:命令长什么样? 出于好奇,会找到命令存放的地方,用cat命令看一下,结果可想而知。 我们知道,命令分内部命令和外部命令,存放在不同的位置。外部命令就是一个可执…

Emacs1.0版本之重要特性及用法实例(一百五十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

【Java 数据结构】LinkedList介绍

LinkedList介绍 回顾ArrayList类链表链表是什么链表的分类单向无头链表模拟实现初始化与基本方法查询修改增加删除 双向无头链表模拟实现初始化与基本方法查询修改增加删除 LinkedList类LinkedList类是什么回顾List接口LinkedList使用构造方法常用方法 LinkedList的遍历ArrayLi…

Windows下编译安装PETSc

本文记录在Windows下使用MinGW-w64编译安装PETSc的流程。 0、环境 操作系统Windows 11MSYS2msys2-x86_64-20240507 1、开发环境 首先&#xff0c;下载并安装MSYS2&#xff0c;然后编辑PATH环境变量&#xff0c;添加mingw64相关路径&#xff1a;C:\msys64\mingw64\bin。 然后…

鼠标为什么要放在鼠标垫上才好用?/ 鼠标的工作原理

原创 OREO 力学科普 在数字化时代&#xff0c;鼠标已经成为我们与计算机交互不可或缺的工具。它不仅提高了工作效率&#xff0c;也丰富了我们的数字生活。鼠标总是能精准地感应到人手的移动方向和距离&#xff0c;从而到达人指定的位置&#xff0c;给我们的计算机操作过程带来…

【区块链+乡村振兴】链上云仓智慧动产监管平台 | FISCO BCOS应用案例

2021 年初 ,《中共中央国务院关于全面推进乡村振兴加快农业农村现代化的意见》将“乡村振兴”的重要性提升 到前所未有的战略高度。而随着科技与金融的深度融合&#xff0c;金融行业亦开始步入大数据、云计算、人工智能、区块 链的新技术发展。启动金融科技赋能乡村振兴示范工程…

企业级营销中心应用架构设计

营销中心依托大数据和数据分析应用,搭建灵活可扩展的系统架构,在客户分群、客户画像、客户标签库及模型工厂的基础上,建立营销全流程管理,包括营销活动的发起、执行、反馈和评价,助力银行实现以数据驱动的精准营销模式。此外,还可提供丰富的场景营销解决方案,协助银行打…

java3d-1_4_0_01-windows-i586.exe

下载 Java 3D API 安装 C:\Program Files\Java\Java3D\1.4.0_01\bin C:\Java\jre6 C:\Java\jdk1.6.0_45 C:\Windows 记录下这 4 个目录&#xff0c;去检查下 4 哥目录下文件多了什么 检查目录① C:\Program Files\Java\Java3D\1.4.0_01\bin 检查目录② C:\Java\jre6 C:…

LVS服务的搭建之NAT模式、DR模式的搭建实战

# LVS的概述 1/什么是LVS linux virtural server的简称&#xff0c;也就是linxu虚拟机服务器&#xff0c;使用lvs可以达到的技术目标是&#xff1a;通过linux达到负载均衡技术和linux操作系统实现一个高性能高可用的linux服务器集群&#xff0c;他具有良好的可靠性&#xff0…

Deepin-Bash中判断是Wayland还是X11显示

Bash中判断是Wayland还是X11显示 一、概述 一、概述 记录一下Linux显示协议的类型 echo $XDG_SESSION_TYPE如果输出是 x11&#xff0c;则使用的 Xorg如果输出是 wayland&#xff0c;则使用的 Wayland

气膜滑雪场重新定义滑雪体验的未来—轻空间

随着滑雪运动的日益普及&#xff0c;滑雪场的建设标准也在不断提高。气膜滑雪场作为一种创新的建筑形式&#xff0c;以其独特的技术优势&#xff0c;正在重新定义滑雪体验。与传统滑雪场相比&#xff0c;气膜滑雪场不仅提升了运营效率&#xff0c;还为滑雪者提供了更为舒适、安…

《学会 SpringBoot · 优雅停机方案》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

C语言文达学院班级管理系统-计算机毕业设计源码03499

摘 要 本文阐述了一个C语言文达学院班级管理系统的设计与实现过程。该系统充分利用ASP.NET的轻量级、灵活性和可扩展性&#xff0c;旨在为文达学院提供高效、便捷的班级管理系统。通过详细的需求分析、技术选型、系统设计、开发实现、测试与调试以及部署与上线等步骤&#xff0…

程序员常用的工具软件推荐(提高工作效率和代码质量)

前言 我们在日常开发过程中&#xff0c;通常需要借助多款开发工具来提高工作效率和代码质量。今天大姚分享一些比较实用且高效的开发工具&#xff0c;希望可以帮助到有需要的同学。 程序员常用的工具软件 以上工具都已收录到程序员常用的工具软件栏目中&#xff0c;欢迎关注…

边缘计算技术解决行业痛点,TSINGSEE智能分析网关V4技术特点与应用场景解析

一、行业背景 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;边缘计算硬件作为其核心组成部分&#xff0c;正逐步成为市场的新宠。这些硬件不仅提升了数据处理和分析的效率&#xff0c;还极大地降低了数据传输的延迟&#xff0c;为各行各业的智能化转型提…

【git使用】本地文件上传到github已有仓库以及后续版本控制op(持续更新,20240810)

git使用 0.写在前面1. 本地与远程的连接1.0 本地仓库op1.1 暂存仓库op1.3 创建keygen进行SSH连接1.4 远程仓库op1.5 残留问题 reference2.更新与版本控制&#xff08;后续更新&#xff09; 0.写在前面 相信有一堆人到现在还没用清楚git进行项目管理&#xff0c;&#xff0c;&a…

【Python实现代码视频/视频转字符画/代码风格视频】

该程序改良自GitHub开源项目VideoCharDraw 在源程序CharDraw_thread.py 带压缩和多线程版本字符画的基础上使用Tkinter库添加了图形化的操作&#xff0c;使用户操作体验更方便。 什么是视频字符画&#xff1f; 视频转字符画是一种将视频中的每一帧图像转换为由字符组成的图…

Java设计模式-抽象工厂模式-一次性理解透

1. 抽象工厂模式简介 抽象工厂设计模式是创建型模式之一。抽象工厂模式与工厂模式几乎相似&#xff0c;只是它更像工厂中的工厂。 如果您熟悉Java 中的工厂设计模式&#xff0c;或看过上一篇我写的“java简单工厂模式”&#xff0c;您会注意到我们有一个工厂类。此工厂类根据…

WPF篇(18)-DataGrid数据表格控件+ComboBox下拉框控件

DataGrid数据表格控件 DataGrid是一个可以多选的数据表格控件。所以&#xff0c;它继承一个支持多选的父类——MultiSelector。 public abstract class MultiSelector : Selector {protected MultiSelector();public IList SelectedItems { get; }protected bool CanSelectMu…