【Qt】文件

news2025/7/5 1:56:16

🌈 个人主页:Zfox_
🔥 系列专栏:Qt

目录

  • 一:🔥 Qt 文件概述
  • 二:🔥 输入输出设备类
  • 三:🔥 文件读写类
  • 四:🔥 文件和目录信息类
  • 五:🔥 其他
  • 六:🔥 共勉

一:🔥 Qt 文件概述

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

二:🔥 输入输出设备类

在 Qt 中,文件读写的类为 QFile

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

Qt 中主要的⼀些 I/O 设备类的继承关系如下图所示:

image-20250130174219437

名称作用
QFile用于 文件操作和文件数据读写 的类,使用 QFile 可以读写任意格式的文件。
QSaveFile用于 安全保存文件 的类。是使用 OSaveFile 保存文件时,它会先把数据写入一个临时文件,成功提交后才将数据写入最终的文件。如果保存过程中出现错误,临时文件里的数据不会被写入最终文件,这样就能确保最终文件中不会丢失数据或被写入部分数据。在保存比较大的文件或复杂格式的文件时可以使用这个类,例如从网络上下载文件等。
QTemporaryFile用于 创建临时文件 的类。使用函数 QTemporaryFile::open() 就能创建一个文件名唯一的临时文件,在 QTemporaryFile 对象被删除时,临时文件被自动删除
QTcpSocket
QUdpSocket
分别实现了 TCPUDP 的类。
OSerialPort实现了 串口通信 的类,通过这个类可以实现计算机与串口设备的通信。
QBluetoothSocket用于 蓝牙通信 的类。手机和平板计算机等移动设备有蓝牙通信模块,笔记本电脑一般也有蓝牙通信模块。通过 QBluetoothSocket 类,就可以编写蓝牙通信程。如编程实现笔记本电脑与手机的蓝牙通信。
QProcess用于启动外部程序,并且可以给程序传递参数。
相当于是对 fork / exec 操作进行的封装
QBuffer以一个 QByteArray 对象作为数据缓冲区,将 QByteArray 对象当作一个 I/0 设备来读写。
  • 串口:一种比较古老的通信方式,一般是在嵌入式系统上,通过串口和开发板之间进行交互操作

三:🔥 文件读写类

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

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

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

image-20250131143636887

名称说明
QIODevice::NotOpen没有打开设备
QIODevice::ReadOnly只读 方式打开设备
QIODevice::WriteOnly只写 方式打开设备
QIODevice::ReadWrite读写 方式打开设备
QIODevice::Append追加 方式打开设备,数据写到文件末尾
QIODevice::Truncate每次打开文件后重写文件内容,原内容将被删除
QIODevice::Text在读文件时,行尾终止符会被转换为 ‘\n’;当写入文件时,行尾终止符会被转换为本地编码。如:Win32上为 ‘\r\n’;
QIODevice::Unbuffered无缓冲形式打开文件,绕过设备中的任何缓冲区
QIODevice::NewOnly文件存在则打开失败,不存在则创建文件

代码示例1:创建和打开文件

#include <QFile>
#include <QTextStream>
#include <QDebug>

void createAndWriteFile(const QString &filePath) {
    QFile file(filePath);
    if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        QTextStream out(&file);
        out << "Hello, Qt!\n";
        file.close();
    } else {
        qDebug() << "无法打开文件:" << file.errorString();
    }
}

代码示例2:读取文件

void readFile(const QString &filePath) {
    QFile file(filePath);
    if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        QTextStream in(&file);
        while (!in.atEnd()) {
            QString line = in.readLine();
            qDebug() << line;
        }
        file.close();
    } else {
        qDebug() << "无法打开文件:" << file.errorString();
    }
}

代码如下:

#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* ac1 = new QAction("打开"); // 添加菜单项
    QAction* ac2 = new QAction("保存");
    menu->addAction(ac1);
    menu->addAction(ac2);

    // 指定一个输入框 edit 为全局变量
    edit = new QPlainTextEdit();
    QFont font;
    font.setPixelSize(25);
    edit->setFont(font);
    this->setCentralWidget(edit);

    // 连接 QAction 信号槽
    connect(ac1, &QAction::triggered, this, &MainWindow::handleAction1);
    connect(ac2, &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);
    if(!file.open(QIODevice::ReadOnly)){
        // 打开文件失败
        statusBar->showMessage(path + " 打开失败");
        return;
    }
    // 4. 读取文件
    // 这里需要确保打开的文件是文本文件才行
    // 如果是 二进制文件, 交给 QString,
    QString text = file.readAll();
    // 5. 关闭文件,并设置读取内容
    file.close();
    edit->setPlainText(text);
}

void MainWindow::handleAction2()
{
    // 1. 先弹出 "打开文件" 对话框,选择打开文件
    QString path = QFileDialog::getOpenFileName(this);
    // 2. 显示文件名
    QStatusBar* statusBar = this->statusBar();
    statusBar->showMessage(path);
    // 3. 根据用户选择路径,构造一个 QFile 对象,并且打开文件
    QFile file(path);
    if(!file.open(QIODevice::WriteOnly)){
        statusBar->showMessage(path + " 打开失败");
        return;
    }
    // 4. 写文件
    const QString& text = edit->toPlainText();
    file.write(text.toUtf8());

    file.close();
}

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

结果如下:

四:🔥 文件和目录信息类

QFilelnfoQt 提供的一个用于获取文件和目录信息的类,如获取文件名、文件大小、文件修改日期等。QFileInfo 类中提供了很多的方法,常用的有:

方法名称作用
isDir()检查该文件是否是目录
isExecutable()检查该文件是否是可执行文件
fileName()获得文件名
completeBaseName()获取完整的文件名
suffix()获取文件后缀名
completeSuffix()获取完整文件后缀
size()获取文件大小
isFile()判断是否为文件
fileTime()获取文件创建时间、修改时间、最近访问时间等
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>
#include <QFileDialog>

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

    QPushButton* button = new QPushButton("查看文件属性", this);
    connect(button, &QPushButton::clicked, [=](){
       QString path = QFileDialog::getOpenFileName(this);
       QFileInfo fileInfo(path); // 构造对象
       // 打印相关属性
       qDebug() << fileInfo.fileName();
       qDebug() << fileInfo.suffix();
       qDebug() << fileInfo.path();
       qDebug() << fileInfo.size();
       qDebug() << fileInfo.isFile();
       qDebug() << fileInfo.isDir();
       // ...
    });
}

五:🔥 其他

① 创建删除目录

#include <QDir>

void createDirectory(const QString &dirPath) {
    QDir dir;
    if (!dir.exists(dirPath)) {
        if (dir.mkpath(dirPath)) {
            qDebug() << "目录创建成功:" << dirPath;
        } else {
            qDebug() << "无法创建目录:" << dir.errorString();
        }
    } else {
        qDebug() << "目录已存在:" << dirPath;
    }
}

void deleteDirectory(const QString &dirPath) {
    QDir dir(dirPath);
    if (dir.exists()) {
        if (dir.rmdir(dirPath)) {
            qDebug() << "目录删除成功:" << dirPath;
        } else {
            qDebug() << "无法删除目录:" << dir.errorString();
        }
    } else {
        qDebug() << "目录不存在:" << dirPath;
    }
}

② 选择文件

QFileDialog::getOpenFileName() 函数可以用来打开文件选择对话框,让用户选择文件。

#include <QApplication>
#include <QFileDialog>
#include <QPushButton>
#include <QWidget>
#include <QVBoxLayout>
#include <QMessageBox>

class FileSelector : public QWidget {
public:
    FileSelector() {
        QPushButton *button = new QPushButton("选择文件", this);
        QVBoxLayout *layout = new QVBoxLayout(this);
        layout->addWidget(button);
        
        // 点击按钮时打开文件选择器
        connect(button, &QPushButton::clicked, this, &FileSelector::selectFile);
    }

private slots:
    void selectFile() {
        QString fileName = QFileDialog::getOpenFileName(this, tr("打开文件"), "", tr("所有文件 (*.*);;文本文件 (*.txt)"));
        
        if (!fileName.isEmpty()) {
            QMessageBox::information(this, tr("选择的文件"), fileName);
        }
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    FileSelector window;
    window.setWindowTitle("文件选择示例");
    window.resize(300, 100);
    window.show();
    
    return app.exec();
}

说明:
QFileDialog::getOpenFileName():用于打开单个文件选择对话框。
参数解释:

  • 第一个参数是父窗口。
  • 第二个参数是对话框标题。
  • 第三个参数是默认路径。
  • 第四个参数是过滤器,用于指定可以选择的文件类型。

③ 选择文件夹

QFileDialog::getExistingDirectory() 用来让用户选择文件夹

#include <QApplication>
#include <QFileDialog>
#include <QPushButton>
#include <QWidget>
#include <QVBoxLayout>
#include <QMessageBox>

class FolderSelector : public QWidget {
public:
    FolderSelector() {
        QPushButton *button = new QPushButton("选择文件夹", this);
        QVBoxLayout *layout = new QVBoxLayout(this);
        layout->addWidget(button);
        
        // 点击按钮时打开文件夹选择器
        connect(button, &QPushButton::clicked, this, &FolderSelector::selectFolder);
    }

private slots:
    void selectFolder() {
        QString folderName = QFileDialog::getExistingDirectory(this, tr("选择文件夹"), "");

        if (!folderName.isEmpty()) {
            QMessageBox::information(this, tr("选择的文件夹"), folderName);
        }
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    FolderSelector window;
    window.setWindowTitle("文件夹选择示例");
    window.resize(300, 100);
    window.show();
    
    return app.exec();
}

  • 注意:QFileDialog::getExistingDirectory():用于打开选择文件夹的对话框。

④ 选择多个文件

如果你想让用户一次选择多个文件,可以使用

QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("选择多个文件"), "", tr("所有文件 (*.*);;图片文件 (*.png *.jpg)"));

if (!fileNames.isEmpty()) {
    for (const QString &fileName : fileNames) {
        // 处理每个文件
        qDebug() << "选择的文件:" << fileName;
    }
}

上面三个的区别如下:

名称作用
QFileDialog::getOpenFileName()选择单个文件
QFileDialog::getExistingDirectory()选择文件夹
QFileDialog::getOpenFileNames()选择多个文件

这段代码允许用户同时选择多个文件,返回的是 QStringList,可以遍历进行处理。

⑤ 过滤文件类型

在文件选择对话框中,可以使用过滤器来限制用户选择某些特定类型的文件

QString fileName = QFileDialog::getOpenFileName(this, tr("打开文件"), "", tr("图像文件 (*.png *.jpg);;文本文件 (*.txt);;所有文件 (*.*)"));

六:🔥 共勉

😋 以上就是我对 【Qt】文件 的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉
在这里插入图片描述

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

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

相关文章

【AI】[特殊字符]生产规模的向量数据库 Pinecone 使用指南

一、Pinecone 的介绍 Pinecone是一个完全托管的向量数据库服务&#xff0c;专为大规模机器学习应用设计。它允许开发者轻松存储、搜索和管理高维向量数据&#xff0c;为推荐系统、语义搜索、异常检测等应用提供强大的基础设施支持。 1.1 Pinecone的核心特性 1. 高性能向量搜…

dstream

DStream转换DStream 上的操作与 RDD 的类似&#xff0c;分为 Transformations&#xff08;转换&#xff09;和 Output Operations&#xff08;输出&#xff09;两种&#xff0c;此外转换操作中还有一些比较特殊的原语&#xff0c;如&#xff1a;updateStateByKey()、transform(…

HFSS5(李明洋)——设置激励(波端口激励)

Magnetic是适用于铁磁氧导体的&#xff0c;只有前三种激励类型可以用于计算S参数 1波端口激励 也可以设置在模型内部&#xff0c;如果是设置在模型内部必须加一段理想导体&#xff0c;用于指定端口方向 1.1——模式 number 输入N&#xff1a;计算1-N的模式都计算 1.2——模式…

ubiquant比赛系列——用docker准备ubipoker开发环境

比赛过程&#xff1a; 环境准备&#xff1a; #在云服务器上拉python官方的docker镜像并下载到本地 https://hub.docker.com/_/python/ sudo docker pull python:3.11.12-slim-bullseye sudo docker images sudo docker save -o 3.11.12-slim-bullseye.tar python:3.11.12-slim…

Rust实现高性能目录扫描工具ll的技术解析

Rust实现高性能目录扫描工具ll的技术解析 一、项目概述 本项目使用Rust构建了一个类ls命令行工具&#xff0c;具备以下核心特性&#xff1a; 多格式文件信息展示并行目录扫描加速人类可读文件大小运行时性能统计交互式进度提示 二、技术架构 1. 关键技术栈 clap&#xff…

深入理解C语言变量:从基础到实践

在编程世界中&#xff0c;变量是最基础也是最重要的概念之一。作为C语言的核心组成部分&#xff0c;变量承载着程序运行时数据的存储和传递功能。理解变量的工作原理和正确使用方法&#xff0c;是成为一名合格C程序员的必经之路。本文将全面介绍C语言变量的各个方面&#xff0c…

RK3562/3588 系列之0—NPU基础概念

RK3562/3588 系列之0—NPU基础概念 1.处理器分类2.算力衡量指标TOPS参考文献 1.处理器分类 中央处理器(CPU)&#xff1b; 图形处理器 (GPU)&#xff1b; 神经网络处理器(NPU)。 每个处理器擅长不同的任务:CPU擅长顺序控制和即时性&#xff1b;GPU适合并行数据流处理,NPU擅长…

canvas画板!随意画!!

希望你天天开心 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>绘画板</title…

Float32、Float16、BFloat16

我们先介绍 Float32、Float16、BFloat16 的 浮点数表示方法 然后根据浮点数表示&#xff0c;来分析总结他们是怎么控制 精度和 数值范围 的 最后再来对比的说明 Float32、Float16、BFloat16 的 应用场景 和 硬件支持 1、浮点数的表示方法 Float32 &#xff1a; 单精度浮点数…

5V 1A充电标准的由来与技术演进——从USB诞生到智能手机时代的电力革命

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 一、起源&#xff1a;USB标准与早期电力传输需求 1. USB的诞生背景 1996年&#xff0c;由英特尔、微软、IBM等公司组成的USB-IF&#xff08;USB Implementers Forum&#xff09;发布了…

微信小程序蓝牙连接打印机打印单据完整Demo【蓝牙小票打印】

文章目录 一、准备工作1. 硬件准备2. 开发环境 二、小程序配置1. 修改app.json 三、完整代码实现1. pages/index/index.wxml2. pages/index/index.wxss3. pages/index/index.js 四、ESC/POS指令说明五、测试流程六、常见问题解决七、进一步优化建议 下面我将提供一个完整的微信…

龙虎榜——20250425

指数依然在震荡&#xff0c;等待方向选择&#xff0c;整体量能不搞但个股红多绿少。 2025年4月25日龙虎榜行业方向分析 一、核心主线方向 绿色电力&#xff08;政策驱动业绩弹性&#xff09; • 代表标的&#xff1a;华银电力&#xff08;绿电运营&#xff09;、西昌电力&…

计算机组成原理:指令系统

计算机组成原理:指令集系统 指令集体系结构(ISA)ISA定义ISA包含的内容举个栗子指令的基本组成(操作码+地址码)指令分类:地址码的个数定长操作码变长操作码变长操作码的原则变长操作码的设计指令寻址寻址方式的目的寻址方式分类有效地址直接在指令中给出有效地址间接给出有效地…

【Go语言】RPC 使用指南(初学者版)

RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种计算机通信协议&#xff0c;允许程序调用另一台计算机上的子程序&#xff0c;就像调用本地程序一样。Go 语言内置了 RPC 支持&#xff0c;下面我会详细介绍如何使用。 一、基本概念 在 Go 中&…

Python----深度学习(基于深度学习Pytroch簇分类,圆环分类,月牙分类)

一、引言 深度学习的重要性 深度学习是一种通过模拟人脑神经元结构来进行数据学习和模式识别的技术&#xff0c;在分类任务中展现出强大的能力。 分类任务的多样性 分类任务涵盖了各种场景&#xff0c;例如簇分类、圆环分类和月牙分类&#xff0c;每种任务都有不同的…

uniapp-商城-38-shop 购物车 选好了 进行订单确认4 配送方式1

配送方式在订单确认页面最上方&#xff0c;可以进行选中配送还是自提&#xff0c;这里先看看配送。 代码样式&#xff1a; 可以看出来是通过组件来实现的。组件名字是&#xff1a;delivery-layout 1、建立组件文件夹和页面&#xff0c;delivery-layout这里就只有配送 2、具体…

uniappx 打包配置32位64位x86安装包

{"app": {"distribute": {"android": {"abiFilters": ["armeabi-v7a","arm64-v8a","x86","x86_64"]}}} }

【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)

Inverse Reinforcement Learning (IRL) 详解 什么是 Inverse Reinforcement Learning&#xff1f; 在传统的强化学习 (Reinforcement Learning, RL) 中&#xff0c;奖励函数是已知的&#xff0c;智能体的任务是学习一个策略来最大化奖励 而在逆向强化学习 (Inverse Reinforc…

《普通逻辑》学习记录——性质命题及其推理

目录 一、性质命题概述 二、性质命题的种类 2.1、性质命题按质的分类 2.2、性质命题按量的分类 2.3、性质命题按质和量结合的分类 2.4、性质命题的基本形式归纳 三、四种命题的真假关系 3.1、性质命题与对象关系 3.2、四种命题的真假判定 3.3、四种命题的对当关系 四、四种命题…

人工智能(AI)对网络管理的影响

近年来&#xff0c;人工智能(AI)尤其是大语言模型(LLMs)的快速发展&#xff0c;正在深刻改变网络管理领域。AI的核心价值在于其能够通过自动化、模式分析和智能决策&#xff0c;显著提升网络运维效率并应对复杂挑战。具体表现为&#xff1a; 快速数据查询与分析​​&#xff1…