????????在很多時候我們需要讀寫文本文件進行讀寫,比如寫個 Mp3 音樂播放器需要讀 Mp3 歌詞里的文本,比如修改了一個 txt 文件后保存,就需要對這個文件進行讀寫操作。本文介紹簡單的文本文件讀寫,內(nèi)容精簡,讓大家了解文本讀寫的基本操作。
QFile 讀寫文本
????????QFile 類提供了讀取和寫入文件的接口。在嵌入式里如果需要讀寫文件,最簡單的方法就是 用 Qfile,例如利用QFile來讀寫 Linux 下的字符設(shè)備(可把字符設(shè)備當作一個文本處理,linux 下一切皆文件),雖然只是寫‘0’或‘1’,但也是對文件(文本)的讀寫了。
????????QFile 是一個讀寫文本、二進制文件和資源的 I/O 設(shè)備。QFile 可以自己使用,也可以更方便地與 QTextStream 或 QDataStream 一起使用。
????????文件名通常在構(gòu)造函數(shù)中傳遞,但它可以在任何時候使用 setFileName()設(shè)置。不支持使用其他分隔符(例如'\')。所以在 Windows、Linux 或者 Mac 里文件的路徑都是用'/'。不能看到 Windows 的路徑是'\',我們就可以在寫入的文件路徑里添加這個'\'。不管操作系統(tǒng)是什么,QFile 的文件分隔符都是'/'。
????????可以使用 exists()檢查文件是否存在,并使用 remove()刪除文件。(更高級的文件系統(tǒng)相關(guān)操 作由 QFileInfo 和 QDir 提供)用 open()打開文件,用 close()關(guān)閉文件,用 flush()刷新文件。通常使用 QDataStream 或 QTextStream 讀寫數(shù)據(jù),但也可以調(diào)用 QIODevice 繼承的函數(shù) read()、 readLine()、readAll()、write()。QFile 還繼承 getChar()、putChar()和 ungetChar(),它們一次只處 理一個字符。文件的大小由 size()返回。可以使用 pos()獲取當前文件位置,也可以使用 seek() 移動到新的文件位置。如果已經(jīng)到達文件的末尾,則 atEnd()返回 true。
????????QFile::open()函數(shù)打開文件時需要傳遞 QIODevice::OpenModeFlag 枚舉類型的參數(shù),決定 文件以什么方式打開,QIODevice::OpenModeFlag 類型的主要取值如下:
- QIODevice::ReadOnly:以只讀方式打開文件,用于載入文件。
- QIODevice::WriteOnly:以只寫方式打開文件,用于保存文件。
- QIODevice::ReadWrite:以讀寫方式打開。
- QIODevice::Append:以添加模式打開,新寫入文件的數(shù)據(jù)添加到文件尾部。
- QIODevice::Truncate:以截取方式打開文件,文件原有的內(nèi)容全部被刪除。
- QIODevice::Text:以文本方式打開文件,讀取時“\n”被自動翻譯為換行符,寫入時字符 串結(jié)束符會自動翻譯為系統(tǒng)平臺的編碼,如 Windows 平臺下是“\r\n”。
????????這些取值可以組合,例如 QIODevice::ReadOnly | QIODevice::Text 表示以只讀和文本方式打開文件。
????????使用 QFile 對一個文本文件的操作流程是以下這樣的。
應(yīng)用實例
? ? ? ? 創(chuàng)建項目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;
/* 關(guān)閉文件按鈕 */
QPushButton *clsoePushButton;
private slots:
/* 打開文本文件 */
bool openFile();
/* 關(guān)閉文本文件 */
void closeFile();
};
#endif // MAINWINDOW_H
????????在源文件“mainwindow.cpp”具體代碼如下。
#include "mainwindow.h"
#include <QFileDialog>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
/* 設(shè)置窗口的位置與大小 */
this->setGeometry(0, 0, 800, 480);
/* 布局設(shè)置 */
textEdit = new QTextEdit();
vBoxLayout = new QVBoxLayout();
hBoxLayout = new QHBoxLayout();
vWidget = new QWidget();
hWidget = new QWidget();
openPushButton = new QPushButton();
closePushButton = new QPushButton();
/* 設(shè)置兩個按鈕的大小 */
openPushButton->setMinimumHeight(50);
openPushButton->setMaximumWidth(120);
closePushButton->setMinimumHeight(50);
closePushButton->setMaximumWidth(120);
/* 設(shè)置兩個按鈕的文本 */
openPushButton->setText("打開");
closePushButton->setText("關(guān)閉");
/* 設(shè)置關(guān)閉按鈕為不可用屬性,需要打開文件才設(shè)置為可用屬性 */
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());
/* 設(shè)置打開按鈕不可用,需要關(guān)閉再打開 */
openPushButton->setEnabled(false);
/* 設(shè)置關(guān)閉按鈕為可用屬性 */
closePushButton->setEnabled(true);
/* 關(guān)閉文件 */
file.close();
return true;
}
void MainWindow::closeFile(){
/* 檢測打開按鈕是否可用,不可用時,說明已經(jīng)打開了文件 */
if(!openPushButton->isEnabled()){
/* 獲取 textEdit 的文本內(nèi)容 */
QString str = textEdit->toPlainText();
/* 以只讀的方式打開 */
if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
return;
/* 轉(zhuǎn)換為字節(jié)數(shù)組 */
QByteArray strBytes = str.toUtf8();
/* 寫入文件 */
file.write(strBytes, strBytes.length());
/* 清空 textEdit 的顯示內(nèi)容 */
textEdit->clear();
/* 關(guān)閉文件 */
file.close();
/* 重新設(shè)置打開和關(guān)閉按鈕的屬性 */
openPushButton->setEnabled(true);
closePushButton->setEnabled(false);
}
}
程序運行效果
? ? ? ? 點擊打開?
?????????調(diào)用系統(tǒng)打開文件的窗口。選擇一個文本文件。
?????????打開后,文本的內(nèi)容如下,可以進行修改,修改后點擊關(guān)閉就會寫入到此文件里。本例僅僅用兩個按鈕和一個文本編輯框完成,內(nèi)容簡潔易懂。但是在實際項目里不是用 QPushButton 來做打開文件和關(guān)閉文件的,一般設(shè)計于在菜單欄里用 QAction 來做。包括添加復(fù)制、粘貼、 另存為、關(guān)閉、等等。可以仿照 Windows 里的記事本,用 Qt 寫一個類似的軟件完全可以。
文章來源:http://www.zghlxwxcb.cn/news/detail-525835.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-525835.html
到了這里,關(guān)于【嵌入式Qt開發(fā)入門】如何使用Qt進行文本讀寫——QFile讀寫文本的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!