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的安装包可以私信我,你们的支持是博主坚持创作的动力!💪💪


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