Qt的文件

Qt的文件

🌟🌟hello,各位读者大大们你们好呀🌟🌟

🚀🚀系列专栏:【Qt的学习】

📝📝本篇内容:Qt文件的认识;文件操作;文件代码演示;QFileInfo

⬆⬆⬆⬆上一篇:Qt的事件

💖💖作者简介:轩情吖,请多多指教(>> •̀֊•́ ) ̖́-

1.Qt文件的认识

在我们之前学习Linux,C/C++的时候都学习过文件相关的知识,我们Qt也提供了一套文件操作,但是Qt中使用上述的几种方案来读写文件,也是完全可以的。像Linux的一套API,局限于Linux系统,Windows上的Qt就需要Windows的API。之所以我们Qt要再封装一套API,是因为Qt诞生的太早了,C++还没有"标准化"的概念。咱们在编写Qt程序的时候,更推荐使用Qt自己提供的这一套文件操作,也方便和QString等内置的类很好的配合。

Qt的核心操作也是和其他的一样的,打开文件、读文件、写文件、关闭文件。在Qt中使用QFile这个类完成相关的操作。

大部分的类都是继承于QIODevice,其余的子类都是各自封装了不同的操作,像QFile的子类QTemporaryFile,是用来处理临时文件的,当这个对象销毁时,对应的文件就自动删除了。QSaveFile是用于要写入大量的数据时用到的,写文件的时候,往往会把旧的文件先清空再写入。万一新的数据写一半,结果出错了,新的数据用不了了,旧的数据也无了。因此如果你想要写入一个文件,会自动把内容写到临时文件中,这样不会破坏原有的文件,等到所有内容都写完了之后,再把旧文件自动删除,并且用新的文件代替旧的文件,这种策略是一个广泛常见的策略。QSerialPort是串口相关的,串口一种比较古老的通信方式,一般是在嵌入式系统上,一般性通过串口和开发板之间进行交互。QProcess是相对于是对fork/exec操作进行的封装。

2.文件操作


QIODevice::OpenMode是用来设置打开方式,只要构造函数,指定了路径之后,可以直接通过这个版本的open打开即可。

读的函数也有好几个,但是都大差不差,read函数既可以使用返回值来获取读的内容也可以通过字符数组,也可以使用readAll来读取所有的内容,以及readLine来按行读取。其中QByteArray可以把它当成QString,他们是可以互相转换的。


写也是差不多的道理

关闭文件本质上是要释放文件描述符表中的表项,文件描述符表存在上限,如果一直打开不关闭的话,就可能会导致文件描述符表被占满,后续就无法再打开新的文件了

3.文件代码演示

我们要实现的功能如上图,在菜单栏中创建一个菜单,菜单中有两个菜单项,分别是打开和保存功能。打开功能可以把文件内容显示在窗口中央区域,保存功能可以把窗口中央区域的内容保存到文件中。

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <QFileDialog>


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

    //获取到菜单栏
    QMenuBar* menubar=this->menuBar();

    //添加菜单
    QMenu* menu_file=new QMenu("文件");
   menubar->addMenu(menu_file);

    //添加菜单项
    QAction* action1=new QAction("打开");
    QAction* action2=new QAction("保存");
    menu_file->addAction(action1);
    menu_file->addAction(action2);

    //进行信号槽设置
    connect(action1,&QAction::triggered,this,&MainWindow::Handle_Open);
    connect(action2,&QAction::triggered,this,&MainWindow::Handle_Save);


   edit=new QPlainTextEdit(this);
   //设置字体像素大小
   QFont font;
   font.setPixelSize(20);
   edit->setFont(font);
   //设置为中央部件
   this->setCentralWidget(edit);

}

void MainWindow::Handle_Open()
{
    //创建一个打开文件的对话框
    QString filename=QFileDialog::getOpenFileName();

    //状态栏展示
    QStatusBar* statusbar=this->statusBar();
    statusbar->showMessage(filename);

    //创建文件
    QFile file(filename);
    //打开文件
    bool ret=file.open(QIODevice::ReadOnly);
    if(ret==false)
    {
     statusbar->showMessage(filename+"打开失败!");
    }
    //读取文件
    //返回值正好有对应的QString构造函数
    QString content(file.readAll());
    //设置文本内容到文本框
    edit->setPlainText(content);
    //关闭文件
    file.close();
}

void MainWindow::Handle_Save()
{
    //创建一个保存文件的对话框
    QString filename=QFileDialog::getSaveFileName();

    //状态栏展示
    QStatusBar* statusbar=this->statusBar();
    statusbar->showMessage(filename);

    //创建文件
    QFile file(filename);
    //打开文件
    bool ret=file.open(QIODevice::WriteOnly);
    if(ret==false)
    {
     statusbar->showMessage(filename+"打开失败!");
    }

    //获取文本框内容
    QString content=edit->toPlainText();
    //写入文件
    file.write(content.toUtf8());
    //关闭文件
    file.close();
}

MainWindow::~MainWindow()
{
    delete ui;
}
cpp 复制代码
#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);
    void Handle_Open();
    void Handle_Save();
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QPlainTextEdit* edit;
};
#endif // MAINWINDOW_H


4.QFileInfo

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

🌸🌸Qt的文件大概就讲到这里啦,博主后续会继续更新更多Qt的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!如有小伙伴需要Qt的安装包可以私信我,你们的支持是博主坚持创作的动力!💪💪

相关推荐
fengtangjiang1 小时前
nacos服务之间相互调用
android·java·开发语言
csbysj20201 小时前
jEasyUI 创建树形下拉框
开发语言
willhuo1 小时前
纯C#实现了RTSP摄像头拉流并转存MP4文件
开发语言·c#·视频编解码
独隅1 小时前
macOS 查看与安装 Java JDK 全面指南(2026年版)
java·开发语言·macos
独自破碎E2 小时前
BISHI75 阶幂
android·java·开发语言
卓越软件开发2 小时前
毕设全栈开发一条龙:Java/SpringBoot/Vue/ 小程序 / Python / 安卓 / AI 图像识别 人脸检测 车牌识别 YOLO
开发语言·spring boot·python·yolo·小程序·毕业设计·课程设计
一叶之秋14122 小时前
千面之法: 释放 C++ 多态的灵活威力
开发语言·c++
柒.梧.2 小时前
Java拷贝精讲:彻底分清浅拷贝与深拷贝
java·开发语言·python
一晌小贪欢2 小时前
PyQt5 实战:批量图片添加水印工具(带右侧实时预览)(附代码及下载链接)
开发语言·qt·添加水印·图片添加水印·蹄片水印