【嵌入式Qt开发入门】如何使用Qt进行文本读写——QFile读写文本

        在很多时候我们需要读写文本文件进行读写,比如写个 Mp3 音乐播放器需要读 Mp3 歌词里的文本,比如修改了一个 txt 文件后保存,就需要对这个文件进行读写操作。本文介绍简单的文本文件读写,内容精简,让大家了解文本读写的基本操作。

QFile 读写文本

        QFile 类提供了读取和写入文件的接口。在嵌入式里如果需要读写文件,最简单的方法就是 用 Qfile,例如利用QFile来读写 Linux 下的字符设备(可把字符设备当作一个文本处理,linux 下一切皆文件),虽然只是写‘0’或‘1’,但也是对文件(文本)的读写了。

        QFile 是一个读写文本、二进制文件和资源的 I/O 设备。QFile 可以自己使用,也可以更方便地与 QTextStream 或 QDataStream 一起使用。

        文件名通常在构造函数中传递,但它可以在任何时候使用 setFileName()设置。不支持使用其他分隔符(例如'\')。所以在 Windows、Linux 或者 Mac 里文件的路径都是用'/'。不能看到 Windows 的路径是'\',我们就可以在写入的文件路径里添加这个'\'。不管操作系统是什么,QFile 的文件分隔符都是'/'。

        可以使用 exists()检查文件是否存在,并使用 remove()删除文件。(更高级的文件系统相关操 作由 QFileInfo 和 QDir 提供)用 open()打开文件,用 close()关闭文件,用 flush()刷新文件。通常使用 QDataStream 或 QTextStream 读写数据,但也可以调用 QIODevice 继承的函数 read()、 readLine()、readAll()、write()。QFile 还继承 getChar()、putChar()和 ungetChar(),它们一次只处 理一个字符。文件的大小由 size()返回。可以使用 pos()获取当前文件位置,也可以使用 seek() 移动到新的文件位置。如果已经到达文件的末尾,则 atEnd()返回 true。

        QFile::open()函数打开文件时需要传递 QIODevice::OpenModeFlag 枚举类型的参数,决定 文件以什么方式打开,QIODevice::OpenModeFlag 类型的主要取值如下:

  • QIODevice::ReadOnly:以只读方式打开文件,用于载入文件。
  • QIODevice::WriteOnly:以只写方式打开文件,用于保存文件。
  • QIODevice::ReadWrite:以读写方式打开。
  • QIODevice::Append:以添加模式打开,新写入文件的数据添加到文件尾部。
  • QIODevice::Truncate:以截取方式打开文件,文件原有的内容全部被删除。
  • QIODevice::Text:以文本方式打开文件,读取时“\n”被自动翻译为换行符,写入时字符 串结束符会自动翻译为系统平台的编码,如 Windows 平台下是“\r\n”。

        这些取值可以组合,例如 QIODevice::ReadOnly | QIODevice::Text 表示以只读和文本方式打开文件。

        使用 QFile 对一个文本文件的操作流程是以下这样的。

应用实例

        创建项目qfile_test,在头文件“mainwindow.h”具体代码如下。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTextEdit>
#include <QFile>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private:
    /* 用于读取文件后显示 */
    QTextEdit *textEdit;
    /* QFile 类型对象 */
    QFile file;
    /* 布局 */
    QHBoxLayout *hBoxLayout;
    QVBoxLayout *vBoxLayout;
    QWidget *hWidget;
    QWidget *vWidget;
    /* 打开文件按钮 */
    QPushButton *openPushButton;
    /* 关闭文件按钮 */
    QPushButton *clsoePushButton;
private slots:
    /* 打开文本文件 */
    bool openFile();
    /* 关闭文本文件 */
    void closeFile();
};
#endif // MAINWINDOW_H

        在源文件“mainwindow.cpp”具体代码如下。

扫描二维码关注公众号,回复: 16276261 查看本文章
#include "mainwindow.h"
#include <QFileDialog>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    /* 设置窗口的位置与大小 */
    this->setGeometry(0, 0, 800, 480);
    /* 布局设置 */
    textEdit = new QTextEdit();
    vBoxLayout = new QVBoxLayout();
    hBoxLayout = new QHBoxLayout();
    vWidget = new QWidget();
    hWidget = new QWidget();
    openPushButton = new QPushButton();
    closePushButton = new QPushButton();
    /* 设置两个按钮的大小 */
    openPushButton->setMinimumHeight(50);
    openPushButton->setMaximumWidth(120);
    closePushButton->setMinimumHeight(50);
    closePushButton->setMaximumWidth(120);
    /* 设置两个按钮的文本 */
    openPushButton->setText("打开");
    closePushButton->setText("关闭");
    /* 设置关闭按钮为不可用属性,需要打开文件才设置为可用属性 */
    closePushButton->setEnabled(false);
    /* 水平布局 */
    hBoxLayout->addWidget(openPushButton);
    hBoxLayout->addWidget(closePushButton);
    hWidget->setLayout(hBoxLayout);
    /* 垂直布局 */
    vBoxLayout->addWidget(textEdit);
    vBoxLayout->addWidget(hWidget);
    vWidget->setLayout(vBoxLayout);
    /* 居中 */
    setCentralWidget(vWidget);
    /* 信号槽连接 */
    connect(openPushButton, SIGNAL(clicked()), this, SLOT(openFile()));
    connect(closePushButton, SIGNAL(clicked()), this, SLOT(closeFile()));
}

MainWindow::~MainWindow()
{
}

bool MainWindow::openFile(){
    /* 获取文件的路径 */
    QString fileName = QFileDialog::getOpenFileName(this);
    /* 指向文件 */
    file.setFileName(fileName);
    /* 判断文件是否存在 */
    if(!file.exists())
        return false;
    /* 以读写的方式打开 */
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return false;
    /* 读取文本到 textEdit */
    textEdit->setPlainText(file.readAll());
    /* 设置打开按钮不可用,需要关闭再打开 */
    openPushButton->setEnabled(false);
    /* 设置关闭按钮为可用属性 */
    closePushButton->setEnabled(true);
    /* 关闭文件 */
    file.close();
    return true;
}
void MainWindow::closeFile(){
    /* 检测打开按钮是否可用,不可用时,说明已经打开了文件 */
    if(!openPushButton->isEnabled()){
        /* 获取 textEdit 的文本内容 */
        QString str = textEdit->toPlainText();
        /* 以只读的方式打开 */
        if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
               return;
        /* 转换为字节数组 */
        QByteArray strBytes = str.toUtf8();
        /* 写入文件 */
        file.write(strBytes, strBytes.length());
        /* 清空 textEdit 的显示内容 */
        textEdit->clear();
        /* 关闭文件 */
        file.close();
        /* 重新设置打开和关闭按钮的属性 */
        openPushButton->setEnabled(true);
        closePushButton->setEnabled(false);
    }
}

程序运行效果

        点击打开 

         调用系统打开文件的窗口。选择一个文本文件。

         打开后,文本的内容如下,可以进行修改,修改后点击关闭就会写入到此文件里。本例仅仅用两个按钮和一个文本编辑框完成,内容简洁易懂。但是在实际项目里不是用 QPushButton 来做打开文件和关闭文件的,一般设计于在菜单栏里用 QAction 来做。包括添加复制、粘贴、 另存为、关闭、等等。可以仿照 Windows 里的记事本,用 Qt 写一个类似的软件完全可以。

猜你喜欢

转载自blog.csdn.net/cj_lsk/article/details/131536029
今日推荐