【Qt学习】了解Qt文件系统 + 利用QFile类实现记事本功能

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的使用,记事本功能的实现

  • 23
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
运用Qt开发工具来实现一个记事本,用户图形界面操作,通过Qt提供的图形库来设计记事本的管理、应用基本窗口,主要实现打开、新建、保存、另存为、查找、居中、字体、颜色等功能设计,同时在软件内部实现对于这些功能的支持和实现。还有对用户剪切、复制、粘贴、等功能的支持 核心代码讲解 1、打开文件功能 void MainWindow::on_action_2_triggered() { QString filename = QFileDialog::getOpenFileName(this); loadFile(filename); } 打开文件on_action_2_triggered()通过转到槽实现首先定义一个Qstring型的filename让它获取你文件名,其次寻找它的本地连接。 3、保存文件功能 void MainWindow::on_action_3_triggered() { if(isSaved){ saveFile(curFile); } else{ do_file_SaveAS(); } } 保存文件功能on_action_3_triggered()通过转到槽实现,先判断bool型的isSaved是否是正确的,如果错则保存当前文件,否则执行另存为。 5、关闭功能 void MainWindow::on_action_5_triggered() { if(close){ QMessageBox::information(this,"提示","文件尚未保存,关闭"); }else{ ui->textEdit->close(); } } 关闭功能on_action_5_triggered()先对文本进行判断是否是关闭的,如果是错弹出对话框提示消息文件尚未保存,关闭,否则对文档进行关闭 11、查找功能 //查找 void MainWindow::close_findhangshu() { ui->gridLayoutWidget->close(); } close_findhangshu()对查找对话框进行关闭函数。 void MainWindow::on_action_11_triggered() { QDialog *closefind=new QDialog(this); QDialog *findDlg=new QDialog(this); find_textLineEdit=new QLineEdit(findDlg); QPushButton *find_Bth=new QPushButton(tr("查找下一个"),findDlg); QPushButton *close_find=new QPushButton(tr("关闭"),closefind); ui->gridLayout->addWidget(find_textLineEdit); ui->gridLayout->addWidget(find_Bth); ui->gridLayout->addWidget(close_find); connect(find_Bth,SIGNAL(clicked()),this,SLOT(show_findText())); connect(close_find,SIGNAL(clicked()),this,SLOT(close_findhangshu())); } 查找功能on_action_11_triggered()函数通过转到槽实现下面部分:先定义两个QDialog型 指针变量*closefind和*findDlg,对它们进行新创建空间, find_textLineEdit=new QLineEdit(findDlg);新建一个空间对QlineEdit它进行传参,将findDlg传入目的是查找在文档中对应的文字,QPushButton *find_Bth=new QPushButton(tr("查找下一个"),findDlg);QPushButton *close_find=new QPushButton(tr("关闭"),closefind);这两个代码作用相同定义两个Qpubutton当点击查找功能弹出对话框时在对话框中实现查找下一个和关闭connect(find_Bth,SIGNAL(clicked()),this,SLOT(show_findText()));connect(close_find,SIGNAL(clicked()),this,SLOT(close_findhangshu()));点击查找下一个按钮时对它进行连接,执行show_findText()函数中的查找操作,如果点击关闭执行上述所说的close_findhangshu()关闭对话框操作 void MainWindow:: show_findText() { QString findText=find_textLineEdit->text(); if(!ui->textEdit->find(findText,QTextDocument::FindBackward)) { QMessageBox::warning(this,tr("查找"),tr("找不到 %1").arg(findText)); } } show_findText()此函数先定义QString型 findText值,对文本进行扫描,如果文本不能找到找到则提示找不到。 本人也只是一个学生,记得点赞哦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值