【Qt】Qt系统 | Qt文件

news2024/11/13 11:10:29

文章目录

  • 一. 输入输出设备类
  • 二. 文件读写类
  • 三. 文件和目录信息

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

一. 输入输出设备类

在Qt 中,文件读写的类为 QFile其父类为 QFileDevice,为文件操作的抽象类,提供了文件交互操作的底层功能。QFileDevice 的父类是 QIODevice,为I/O操作的抽象类。
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:用于创建临时文件。RAII机制,使用 QTemporaryFile::open() 就能创建一个文件名唯一的临时文件,在 QTemporaryFile 对象销毁时,临时文件就会被自动删除
  • QTcpSocket/QUdpSocket:分别实现 TCP通信 和 UDP通信
  • QSerialPort:实现串口通信在嵌入式中多使用,通过该类实现计算机与串口设备的通信
  • QBluetoothSocket:用于蓝牙通信。通过该类,编写蓝牙通信程序。如编程实现笔记本电脑与手机的蓝牙通信。
  • QProcess:用于启动外部程序,并且可以给程序传递参数
  • QBuffer:以 QByteArray 对象作为数据缓冲区,将 QByteArray 对象当作一个 I/O 设备读写

二. 文件读写类

QFile 提供文件的读写,主要操作有:

  • 读数据:read()、readAll()、readLine()
  • 写数据:write()、writeDate()
  • 关闭文件:close()。文件使用结束后必须关闭,不然会造成资源泄露

readAll() 和 write() 函数原型如下:
在这里插入图片描述
可以看到上述函数 使用 QByteArray,而不是QString

QByteArray 主要用于处理二进制数据和字符串,提供一系列方法操作字节数组,类似与其他编程语言中的字符串或数组处理功能
QString 支持 QByteArray为参数的赋值重载,可直接转化

访问一个 I/O设备前,需要使用 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文件存在则打开失败,不存在则创建文件

代码示例:实现类似记事本的文件打开和文件保存操作

  1. 代码构建窗口框架

mainwindow.h 声明相关槽函数 和 控件对象指针

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
//槽函数
public slots:
    void openFile();
    void saveFile();

private:
    Ui::MainWindow *ui;
    QMenuBar *menubar;//菜单栏
    QPlainTextEdit *edit;//输入框
    QStatusBar *statusbar;//状态栏
};

mainwindow.cpp 编写mainwindow构造函数,完成界面设计

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //获取菜单栏
    menubar = this->menuBar();
    //添加菜单
    QMenu *file = new QMenu("文件", this);
    menubar->addMenu(file);
    //添加菜单项
    QAction *open = new QAction("打开", this);
    QAction *save = new QAction("保存", this);
    file->addAction(open);
    file->addAction(save);
    //连接菜单项的槽函数
    connect(open, &QAction::triggered, this, &MainWindow::openFile);
    connect(save, &QAction::triggered, this, &MainWindow::saveFile);
    //设置输入框为中心控件
    edit = new QPlainTextEdit();
    QFont font;
    font.setPixelSize(25);
    edit->setFont(font);
    this->setCentralWidget(edit);
    //设置状态栏
    statusbar = this->statusBar();
}

窗口界面如下:
在这里插入图片描述

  1. 编写保存文件的槽函数
void MainWindow::saveFile()
{
    //通过文件对话框获取文件名
    QString filePath = QFileDialog::getSaveFileName(this, "保存文件");
    //追加写方式打开文件
    QFile file(filePath);
    bool res = file.open(QIODevice::Append);
    if(!res)
    {
        qDebug() << "保存文件失败";
        file.close();
        return;
    }
    //打开文件成功,向文件写入输入框内容
    statusbar->showMessage(filePath);
    QString text = edit->toPlainText();
    file.write(text.toUtf8());
    //关闭文件
    file.close();
}

运行结果如下:
在这里插入图片描述
3. 编写打开文件的槽函数

void MainWindow::openFile()
{
    //通过文件对话框获取文件名
    QString filePath = QFileDialog::getOpenFileName(this, "打开文件");
    //读方式打开文件
    QFile file(filePath);
    bool res = file.open(QIODevice::ReadOnly);
    if(!res)
    {
        qDebug() << "打开文件失败";
        file.close();
        return;
    }
    //打开文件成功,读取数据
    statusbar->showMessage(filePath);
    QString text = file.readAll();
    edit->setPlainText(text);
    //关闭文件
    file.close();
}

运行结果如下:
在这里插入图片描述

三. 文件和目录信息

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

  • isDir():检查该文件是否是目录
  • isExecutable():检查该文件是否是可执行文件
  • fileName():获取文件名
  • completeBaseName():获取完整的文件名(路径名)
  • suffix():获取文件后缀名
  • completeSuffix():获取完整文件后缀
  • size():获取文件大小
  • isFile():判断是否是文件
  • fileTime():获取文件创建时间、修改时间、最近访问时间等
  • lastModified():直接获取文件最后修改时间

fileTime() 函数原型如下:
在这里插入图片描述
QFileDevice::FileTime 是一个枚举类
在这里插入图片描述

代码示例:通过文件对话框 选择文件,打印其属性

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

    QPushButton *button = new QPushButton("获取文件属性", this);

    connect(button, &QPushButton::clicked, this, [=](){
        //文件对话框获取指定文件名
        QString filePath = QFileDialog::getOpenFileName(this, "获取文件属性");
        //获取文件属性
        QFileInfo info(filePath);
        //打印属性
        qDebug() << "文件名:" << info.fileName();
        qDebug() << "后缀名:" << info.suffix();
        qDebug() << "文件大小:" << info.size();
        qDebug() << "文件路径:" << info.path();
        qDebug() << "是否是文件:" << info.isFile();
        qDebug() << "是否是文件夹:" << info.isDir();
        //文件相关时间
        //文件创建时间
        QDateTime time = info.fileTime(QFileDevice::FileBirthTime);
        qDebug() << "文件创建时间:" << time.toString("yyyy-MM-dd hh:mm:ss").toUtf8().data();
        //文件最后修改时间
        time = info.fileTime(QFileDevice::FileModificationTime);
        qDebug() << "文件最后修改时间:" << time.toString("yyyy-MM-dd hh:mm:ss").toUtf8().data();
        //也可以
        time = info.lastModified();
        qDebug() << "文件最后修改时间:" << time.toString("yyyy-MM-dd hh:mm:ss").toUtf8().data();
    });
}

运行结果如下:
在这里插入图片描述

结束语
感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

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

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

相关文章

Ubuntu上搭建Nginx环境

1. 软件包下载 nginx下载地址 下载linux版本的nginx&#xff0c;如图圈示 2. 将下载好的软件包上传至Linux服务器 假设上传到 /opt/nginx 目录,进入目录 cd /opt/nginx解压&#xff0c;根据版本自行修改版本号 tar zxvf nginx-1.16.0.tar.gz3.安装 安装编译所需的依赖&a…

IGE-LIO:充分利用强度信息克服激光退化场景下的定位精度

更多优质内容&#xff0c;请关注公众号&#xff1a;智驾机器人技术前线 1.论文信息 论文标题&#xff1a;IGE-LIO: Intensity Gradient Enhanced Tightly-Coupled LiDAR-Inertial Odometry 作者&#xff1a;Ziyu Chen, Hui Zhu, Biao Yu, Chunmao Jiang, Chen Hua, Xuhui Fu a…

android openGL ES详解——深度缓冲区

一、深度缓冲区概念 深度缓存区是指一块专门内存区域&#xff0c;存储在显存中&#xff0c;用于存储屏幕上所绘制图形的每个像素点的深度值。深度值越大&#xff0c;离观察者越远。深度值越小&#xff0c;里观察者越近。 深度缓冲区与帧缓冲区相对应&#xff0c;用于记录上面…

Linux 进程 | 进程优先级进程的环境变量

文章目录 进程概念4、进程优先级4.1基本概念4.2查看系统进程4.2.1 ps -l4.2.2 PRI & NI 4.3用top命令更改已存在进程的nice&#xff1a; 5、环境变量5.1常见环境变量5.2查看环境变量5.3测试PATH配置环境变量 5.4代码中获取环境变量5.4代码中获取环境变量 进程概念 4、进程…

Linux网络:TCP UDP socket

Linux网络&#xff1a;TCP & UDP socket socket 套接字sockaddr网络字节序IP地址转换bzero UDP socketsocketbindrecvfromsendto TCP socketsocketbindlistenconnectacceptsendrecv 本博客讲解 Linux 下的 TCP 和 UDP 套接字编程。无论是创建套接字、绑定地址&#xff0c;还…

软件设计师全套备考系列文章16 -- 程序设计语言基础知识

软考-- 软件设计师&#xff08;16&#xff09;-- 程序设计语言基础知识 文章目录 软考-- 软件设计师&#xff08;16&#xff09;-- 程序设计语言基础知识前言一、章节考点二、基本概念三、文法四、有限自动机五、前缀、中缀、后缀表达式六、传值和引用(传址)七、各个程序语言的…

链表OJ题——使用栈实现单链表的逆序打印

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 题目描述&#xff1a;使用栈&#xff0c;实现单链表的逆序打印 二、解题思路 三、解题代码 /*** 非递归实现单链表的顶逆序打印——>通过栈来实现* param*/public void printReverseListFromStack(){Stack<…

HAL库:GPIO唤醒模式 唤醒睡眠模式下的单片机

目录 HAL库&#xff1a;GPIO唤醒模式 唤醒睡眠模式下的单片机 注意事项&#xff1a; 初始化部分&#xff1a; 主函数测试部分 结果如图 HAL库&#xff1a;GPIO唤醒模式 唤醒睡眠模式下的单片机 注意事项&#xff1a; HAL库滴答定时器默认为打开状态&#xff0c;需要关闭…

AI学习指南深度学习篇:循环神经网络(RNN)Python实践

引言 在人工智能的广袤领域中,循环神经网络(Recurrent Neural Networks, RNNs)因其在处理序列数据中的卓越表现而广受关注。RNN的独特之处在于它能够保留输入数据的历史信息,并利用这些信息来预测后续的输出,这使得它在自然语言处理、时间序列预测等领域中拥有广泛的应用…

新审视零阶优化在内存高效大模型微调中的应用

人工智能咨询培训老师叶梓 转载标明出处 随着大模型模型规模的增大&#xff0c;反向传播&#xff08;BP&#xff09;所需的内存开销也日益增加&#xff0c;这对内存效率提出了挑战。尤其是在设备上训练等内存效率至关重要的应用场景中&#xff0c;解决这一问题变得尤为迫切。 …

Sora 代码规范之Refactor this method to not always return the same value.(目的性问题)

Sora描述 Refactor this method to not always return the same value.&#xff08;目的性问题&#xff09; 上述代码&#xff0c;可能出现 总是返回 null 的情况 解决一下 原因&#xff1a;为什么要这么写呢&#xff1f;因为 下面的代码会对 materialInfos 这个集合处理&#…

房子公摊要消失了?

文&#xff5c;琥珀食酒社 作者 | 璇子 你敢信 才短短三个月 江苏、浙江、广东 这三房价高昂的城市 陆续宣布房市重大改革信号 比如将空中花园绿化阳台、 小区景观绿化亭廊 、 开放式风雨连廊等不计容积率 挑高客厅只算单层面积 甚至部分区域买房面积 直接按照套内面…

足球联赛|基于SprinBoot+vue的足球联赛管理系统(源码+数据库+文档)

足球联赛管理系统 目录 基于SprinBootvue的足球联赛管理系统 一、前言 二、系统设计 三、系统功能设计 5.1 系统前台功能实现 5.2 后台功能模块实现 5.2.1 管理员模块实现 5.2.2 用户后台模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选…

20+岁老牌定制家居品牌,如何靠呼叫中心捕获年轻消费者?

Home Tour类一镜到底的短视频&#xff0c;在社交平台一直备受年轻人喜爱。金牌厨柜这个20多岁的老牌定制家居品牌&#xff0c;不仅在高端厨柜和定制家居领域有着深厚的积累&#xff0c;而且一直也在探索数字化转型的新路径&#xff1a;用全新的数字化体系&#xff0c;迎合年轻一…

使用VScode的Git版本控制功能(图文版)

☁️ 前言 今天让我来手把手教你简单入门VScode自带的Git版本控制。 &#x1f389; 初始化仓库 初始化仓库之后&#xff0c;仓库里的文件发生了任何改动都会有相应的提示&#xff0c;这对于我们开发和维护项目非常有帮助。 &#x1f389;提交更改 初始化仓库之后&#xff…

机器学习:K-means算法及代码实现

1、K-means算法原理 K-means算法是一种常用的聚类算法&#xff0c;其目的是将数据集划分为K个簇&#xff08;clusters&#xff09;&#xff0c;使得每个簇内部的数据点尽可能相似&#xff0c;而簇与簇之间的数据点尽可能不同。以下是K-means算法的基本原理和步骤&#xff1a; 初…

【C++】C++中的字符串

提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 #include <iostream>using namespace std; void total(string str); int main() {string str;cout << "请输入一个字符串:" ;//cin >>str;getline(…

SAP怎么查找系统全部的增强点呢?

1.在已有的BADI查找程序里面有点手无足措的样子&#xff0c;不知道该如何去找增强&#xff01; 2.这个时候刚刚接触系统还不熟悉&#xff0c;系统里面存在了什么增强&#xff0c;这个时候咋办捏&#xff1f;SE38 -SNIF 此时全部的增强点都在这里面啦&#xff01;&#xff01;&…

使用LinkedHashMap实现固定大小的LRU缓存

使用LinkedHashMap实现固定大小的LRU缓存 1. 什么是LRU&#xff1f; LRU是"Least Recently Used"的缩写&#xff0c;意为"最近最少使用"。LRU缓存是一种常用的缓存淘汰算法&#xff0c;它的核心思想是&#xff1a;当缓存满时&#xff0c;优先淘汰最近最少…

二、设置地图配置表

一、导入一个背景图 由于背景图比较大&#xff0c;需要缩小至0.73 二、写配置文件&#xff08;SO&#xff09; 使用List需要一个命名空间 写一个类&#xff0c;声明房间的出现数量和种类&#xff1b;将它实例化出来 三、枚举变量的多选 在枚举变量中标记命名空间&#xff…