Qt入门8——Qt文件

1. Qt文件概述

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

2. 输入输出设备类

在Qt中,文件读写的类为QFile。QFile的父类为QFileDevice,QFileDevice提供了文件交互操作的 底层功能。QFileDevice的父类是QIODevice,QIODevice的父类为QObject。
QIODevice是Qt中所有输入输出设备(input/outputdevice,简称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设备来读写

3. 文件读写类

在Qt中,文件的读写主要是通过QFile类来实现。在QFile类中提供了⼀些用来读写文件的方法。对于文件的操作主要有:
①读数据:QFile类中提供了多个方法用于读取文件内容;如read()、readAll()、readLine()等。 ②写数据:QFile类中提供了多个方法用于往文件中写内容; ③关闭文件:文件使用结束后必须用函数close()关闭文件。
访问⼀个设备之前,需要使用open()函数打开该设备,而且必须指定正确的打开模式,QIODevice中所有的打开模式由QIODevice::OpenMode枚举变量定义,其取值如下如write()、writeData()等。


示例:实现一个简单记事本

  1. 在构造函数编写菜单栏
cpp 复制代码
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);
}

2.连接信号槽并编写槽函数

cpp 复制代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    //连接信号槽
    connect(action1,&QAction::triggered,this,&MainWindow::handleAction1);
    connect(action2,&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);
    //判断一下打开文件是否成功
    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();
}

效果如图:

4. 文件和目录信息类

QFileInfo是Qt提供的⼀个用于获取文件和目录信息的类,如获取文件名、文件大小、文件修改日期等。QFileInfo类中提供了很多的方法,常用的有:
① isDir() 检查该文件是否是目录;
② isExecutable() 检查该文件是否是可执行文件;
③ fileName()获得文件名;
④ completeBaseName() 获取完整的文件名;
⑤ suffix() 获取文件后缀名;
⑥completeSuffix() 获取完整的文件后缀;
⑦ size() 获取文件大小;
⑧ isFile() 判断是否为文件;
⑨fileTime() 获取文件创建时间、修改时间、最近访问时间等;

示例:

  1. ui界面创建一个label和一个按钮
  2. 编写代码
cpp 复制代码
void Widget::on_pushButton_clicked()
{
    //弹出对话框,并获取文件的属性信息
    QString path = QFileDialog::getOpenFileName(this);
    //构造出一个QFileInfo对象
    QFileInfo fileinfo(path);
    //获取相关属性到label
    ui->label->setText("文件名称:" + fileinfo.fileName() + "\n文件后缀:" + fileinfo.suffix()
                       + "\n文件路径为:" + fileinfo.path() + "\n文件大小为:" + QString::number(fileinfo.size()));
}

效果如图:

相关推荐
松树戈4 分钟前
plus-ui&RuoYi-Vue-Plus 基于pgSql本地运行实践
前端·vue.js·spring boot·ui
new66699910 分钟前
css画图形
前端·css
hjjdebug28 分钟前
constexpr 关键字的意义(入门)
c++·constexpr
Yvonne爱编码1 小时前
CSS- 1.1 css选择器
前端·css·状态模式·html5·hbuilder
山河故人1631 小时前
uniapp使用npm下载
前端·npm·uni-app
虾球xz2 小时前
游戏引擎学习第282天:Z轴移动与摄像机运动
c++·学习·游戏引擎
-曾牛2 小时前
基于微信小程序的在线聊天功能实现:WebSocket通信实战
前端·后端·websocket·网络协议·微信小程序·小程序·notepad++
.小墨迹2 小时前
Apollo学习——planning模块(3)之planning_base
linux·开发语言·c++·学习·自动驾驶
一口一个橘子2 小时前
[ctfshow web入门] web72
前端·web安全·网络安全
Web极客码2 小时前
如何使用WordPress SEO检查器进行实时内容分析
前端·seo·wordpress