1. 前言 - 关于Qt文件

文件操作 是应⽤程序必不可少的部分,Qt作为一个通用开发库,提供了丰富的文件操作类,使得应用程序能够方便地进行文件系统操作。

1.1 QIODevice 介绍

QIODevice 是 Qt 中用于 处理输入输出操作的抽象基类 ,它为文件、网络套接字、串口等设备提供了统一的接口。

下面是QIODevice的子类

QIODevice 子类 描述
QFile 用于读写文件
QBuffer 在内存中创建缓冲区进行数据读写
QProcess 用于启动外部进程并进行通信
QNetworkReply 处理网络请求响应数据
QTcpSocket 用于 TCP 网络套接字通信
QUdpSocket 用于 UDP 网络套接字通信
QSslSocket 支持 SSL 加密的套接字类
QLocalSocket 用于本地套接字通信

1.2 QFile 介绍

这里我们主要使用 QFile 类,提供了对文件的读写功能。QFile 类可以用于打开、读取、写入和关闭文件,以及获取文件信息等操作

下面是QFile的 常用方法:

方法 描述
QFile(const QString &name) 构造函数,创建一个 QFile 对象并指定文件名。
bool open(QIODevice::OpenMode mode) 打开文件,可以指定打开模式,如只读、只写、读写等。
qint64 read(char *data, qint64 maxSize) 从文件中读取最多 maxSize 字节的数据到指定的 data 缓冲区中。
qint64 write(const char *data, qint64 maxSize) 将数据写入文件,最多写入 maxSize 字节的数据。
bool exists() 判断文件是否存在。
qint64 size() 返回文件的大小。
bool remove() 删除文件。
bool rename(const QString &newName) 重命名文件。
bool copy(const QString &newName) 复制文件到指定路径。
bool flush() 刷新文件缓冲区。

1.2 打开文件的方式

当涉及到文件I/O时,Qt提供了多种打开文件的方式。

  • 下面为常用的打开方式:
打开方式 描述
QFile::ReadOnly 以只读方式打开文件。
QFile::WriteOnly 以只写方式打开文件。
QFile::ReadWrite 以读写方式打开文件。
QFile::Append 以追加方式打开文件。
QFile::Text 以文本模式打开文件。
QFile::Truncate 如果文件已经存在,则清空文件内容。
QFile::Unbuffered 禁用文件缓冲,直接进行物理I/O操作。
QFile::NewOnly 如果文件已经存在,则打开失败。
QFile::ExistingOnly 如果文件不存在,则打开失败。

2. 实例 - 记事本功能

2.1 功能实现

下面我们通过上面介绍的类等实现一个简单的记事本,包括三个功能:

  1. 新建窗口
  2. 打开文件
  3. 保存文件

在这里插入图片描述

  • 首先在widget.h中对相关 信号 / 槽函数 进行声明:
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void handleActionBuild(); // 处理 “新建” 按钮
    void handleActionOpen(); // 处理 “打开”按钮
    void handleActionSave(); // 处理 “保存”按钮

private:
    Ui::MainWindow *ui;
    QPlainTextEdit* edit; // 输入框
};
  • 在widget.cpp中的Widget构造函数中进行 控件的创建,以及信号槽的连接:
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* actionBuild = new QAction("新建");
    QAction* actionOpen = new QAction("打开");
    QAction* actionSave = new QAction("保存");
    menu->addAction(actionBuild);
    menu->addAction(actionOpen);
    menu->addAction(actionSave);

    // 设定输入框
    edit = new QPlainTextEdit();
    QFont font; // 字体设定
    font.setPixelSize(20);
    edit->setFont(font);
    // 将输入框加入到窗口中
    this->setCentralWidget(edit);

    // 连接 QAction 的信号槽
    connect(actionBuild, &QAction::triggered, this, &MainWindow::handleActionBuild);
    connect(actionOpen, &QAction::triggered, this, &MainWindow::handleActionOpen);
    connect(actionSave, &QAction::triggered, this, &MainWindow::handleActionSave);
}
  • 随后分别对三个功能的槽函数进行实现(handleActionOpen)(handleActionSave)(handleActionBuild):
    • 对于每段代码功能的实现,都有相应的注释标注。

handleActionBuild

// 新建窗口
void MainWindow::handleActionBuild()
{
    // 新建一个记事本窗口
    MainWindow *newNoteWindow = new MainWindow; // 创建一个新的记事本窗口实例

    // 显示新的记事本窗口
    newNoteWindow->show();
}

handleActionOpen

void MainWindow::handleActionOpen()
{
    // 1. 弹出打开文件
    QString path = QFileDialog::getOpenFileName(this);
    // 2. 将 路径信息 展示到statusBar上
    QStatusBar* statusBar = this->statusBar();
    statusBar->showMessage(path);

    // 3. 将文件加载到QFile中,并打开
    QFile file(path);
    if(!file.open(QFile::ReadWrite)) // open的返回值是bool
    {
        // 打开文件失败
        statusBar->showMessage("打开文件失败: " + path);
        return;
    }

    // 读取文件内容
    QString text = file.readAll();

    // 关闭文件
    file.close();

    // 将内容设置到输入框
    edit->setPlainText(text);
}

handleActionSave

void MainWindow::handleActionSave()
{
    // 1. 弹出 保存文件
    QString path = QFileDialog::getSaveFileName(this);
    // 2. 保存路径信息到 状态栏
    QStatusBar* statusBar = this->statusBar();
    statusBar->showMessage(path);
    //
    QFile file(path);
    if(!file.open(QFile::WriteOnly))
    {
        statusBar->showMessage("打开文件失败: " + path);
        return;
    }

    // 写文件
    const QString& text = edit->toPlainText();
    file.write(text.toUtf8()); // 转为utf8

    // 关闭文件
    file.close();
}

2.2 getOpenFileName() 与 getSaveFileName() 的区别

QFileDialog::getOpenFileName()QFileDialog::getSaveFileName() 是 Qt 中用于打开文件和保存文件对话框的两个函数,它们的主要区别在于其作用和用户交互方面:

  1. QFileDialog::getOpenFileName()

    • 用途:用于打开文件对话框,允许用户选择一个已存在的文件。
    • 功能:用户可以浏览文件系统,选择一个或多个文件以供应用程序使用。
    • 返回值:返回用户选择的文件的路径。
  2. QFileDialog::getSaveFileName()

    • 用途:用于保存文件对话框,允许用户指定一个文件路径来保存数据。
    • 功能:用户可以指定文件名、文件类型和保存位置来保存数据。
    • 返回值:返回用户选择的保存文件的路径。

总的来说,getOpenFileName() 用于打开已存在的文件,而 getSaveFileName() 用于保存新文件。


2.3 效果演示

最终效果如下:

在这里插入图片描述


3. 资源文件

上述所涉及的 代码等资源文件在👇:

QFile的使用,记事本功能的实现

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐