
🌈 個人主頁:Zfox_
🔥 系列專欄:Qt

目錄
- 一:🔥 Qt 文件概述
- 二:🔥 輸入輸出設備類
- 三:🔥 文件讀寫類
- 四:🔥 文件和目錄信息類
- 五:🔥 其他
- 六:🔥 共勉
一:🔥 Qt 文件概述
🦀 文件操作是應用程序必不可少的部分。Qt 作為?個通用開發庫,提供了跨平臺的文件操作能力。Qt 提供了很多關于?件的類,通過這些類能夠對文件系統進行操作,如文件讀寫、文件信息獲取、文件制或重命名等
二:🔥 輸入輸出設備類
在 Qt 中,文件讀寫的類為 QFile
- QFile 的父類為
QFileDevice
,QFileDevice
提供了文件交互操作的底層功能 QFileDevice
的父類是QIODevice
,QIODevice
的父類為QObject
QIODevice
是 Qt 中所有輸入輸出設備(input/output device,簡稱 I/O 設備)的基礎類,I/O 設備就是能進行數據輸入和輸出的設備- 例如文件是?種 I/O 設備,網絡通信中的
socket
是 I/O 設備,串口、藍牙等通信接口也是 I/O 設備,所以它們也是從QIODevice
繼承來的。
Qt 中主要的?些 I/O 設備類的繼承關系如下圖所示:
名稱 | 作用 |
---|---|
QFile | 用于 文件操作和文件數據讀寫 的類,使用 QFile 可以讀寫任意格式的文件。 |
QSaveFile | 用于 安全保存文件 的類。是使用 OSaveFile 保存文件時,它會先把數據寫入一個臨時文件,成功提交后才將數據寫入最終的文件。如果保存過程中出現錯誤,臨時文件里的數據不會被寫入最終文件,這樣就能確保最終文件中不會丟失數據或被寫入部分數據。在保存比較大的文件或復雜格式的文件時可以使用這個類,例如從網絡上下載文件等。 |
QTemporaryFile | 用于 創建臨時文件 的類。使用函數 QTemporaryFile::open() 就能創建一個文件名唯一的臨時文件,在 QTemporaryFile 對象被刪除時,臨時文件被自動刪除 |
QTcpSocket QUdpSocket | 分別實現了 TCP 和 UDP 的類。 |
OSerialPort | 實現了 串口通信 的類,通過這個類可以實現計算機與串口設備的通信。 |
QBluetoothSocket | 用于 藍牙通信 的類。手機和平板計算機等移動設備有藍牙通信模塊,筆記本電腦一般也有藍牙通信模塊。通過 QBluetoothSocket 類,就可以編寫藍牙通信程。如編程實現筆記本電腦與手機的藍牙通信。 |
QProcess | 用于啟動外部程序,并且可以給程序傳遞參數。 相當于是對 fork / exec 操作進行的封裝 |
QBuffer | 以一個 QByteArray 對象作為數據緩沖區,將 QByteArray 對象當作一個 I/0 設備來讀寫。 |
- 串口:一種比較古老的通信方式,一般是在嵌入式系統上,通過串口和開發板之間進行交互操作
三:🔥 文件讀寫類
在 Qt 中,文件的讀寫主要是通過 QFile
類來實現。在 QFile
類中提供了一些用來讀寫文件的方法。對于文件的操作主要有:
- 讀數據:QFile 類中提供了多個方法用于讀取文件內容;如:read()、readAll()、readLine()等。
- 寫數據:QFile 類中提供了多個方法用于往文件中寫內容;如 write()、writeData()等。
- 關閉文件:文件使用結束后必須用函數 close()關閉文件。
訪問一個設備之前,需要使用 open()
函數 打開該設備,而且必須指定正確的打開模式,QIODevice 中所有的打開模式由 QlODevice::OpenMode
枚舉變量定義,其取值如下:
名稱 | 說明 |
---|---|
QIODevice::NotOpen | 沒有打開設備 |
QIODevice::ReadOnly | 以 只讀 方式打開設備 |
QIODevice::WriteOnly | 以 只寫 方式打開設備 |
QIODevice::ReadWrite | 以 讀寫 方式打開設備 |
QIODevice::Append | 以 追加 方式打開設備,數據寫到文件末尾 |
QIODevice::Truncate | 每次打開文件后重寫文件內容,原內容將被刪除 |
QIODevice::Text | 在讀文件時,行尾終止符會被轉換為 ‘\n’;當寫入文件時,行尾終止符會被轉換為本地編碼。如:Win32上為 ‘\r\n’; |
QIODevice::Unbuffered | 無緩沖形式打開文件,繞過設備中的任何緩沖區 |
QIODevice::NewOnly | 文件存在則打開失敗,不存在則創建文件 |
代碼示例1:創建和打開文件
#include <QFile>
#include <QTextStream>
#include <QDebug>void createAndWriteFile(const QString &filePath) {QFile file(filePath);if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {QTextStream out(&file);out << "Hello, Qt!\n";file.close();} else {qDebug() << "無法打開文件:" << file.errorString();}
}
代碼示例2:讀取文件
void readFile(const QString &filePath) {QFile file(filePath);if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {QTextStream in(&file);while (!in.atEnd()) {QString line = in.readLine();qDebug() << line;}file.close();} else {qDebug() << "無法打開文件:" << file.errorString();}
}
代碼如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPlainTextEdit>
#include <QFileDialog>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* ac1 = new QAction("打開"); // 添加菜單項QAction* ac2 = new QAction("保存");menu->addAction(ac1);menu->addAction(ac2);// 指定一個輸入框 edit 為全局變量edit = new QPlainTextEdit();QFont font;font.setPixelSize(25);edit->setFont(font);this->setCentralWidget(edit);// 連接 QAction 信號槽connect(ac1, &QAction::triggered, this, &MainWindow::handleAction1);connect(ac2, &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);if(!file.open(QIODevice::ReadOnly)){// 打開文件失敗statusBar->showMessage(path + " 打開失敗");return;}// 4. 讀取文件// 這里需要確保打開的文件是文本文件才行// 如果是 二進制文件, 交給 QString,QString text = file.readAll();// 5. 關閉文件,并設置讀取內容file.close();edit->setPlainText(text);
}void MainWindow::handleAction2()
{// 1. 先彈出 "打開文件" 對話框,選擇打開文件QString path = QFileDialog::getOpenFileName(this);// 2. 顯示文件名QStatusBar* statusBar = this->statusBar();statusBar->showMessage(path);// 3. 根據用戶選擇路徑,構造一個 QFile 對象,并且打開文件QFile file(path);if(!file.open(QIODevice::WriteOnly)){statusBar->showMessage(path + " 打開失敗");return;}// 4. 寫文件const QString& text = edit->toPlainText();file.write(text.toUtf8());file.close();
}MainWindow::~MainWindow()
{delete ui;
}
結果如下:
四:🔥 文件和目錄信息類
QFilelnfo
是 Qt
提供的一個用于獲取文件和目錄信息的類,如獲取文件名、文件大小、文件修改日期等。QFileInfo
類中提供了很多的方法,常用的有:
方法名稱 | 作用 |
---|---|
isDir() | 檢查該文件是否是目錄 |
isExecutable() | 檢查該文件是否是可執行文件 |
fileName() | 獲得文件名 |
completeBaseName() | 獲取完整的文件名 |
suffix() | 獲取文件后綴名 |
completeSuffix() | 獲取完整文件后綴 |
size() | 獲取文件大小 |
isFile() | 判斷是否為文件 |
fileTime() | 獲取文件創建時間、修改時間、最近訪問時間等 |
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>
#include <QFileDialog>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton* button = new QPushButton("查看文件屬性", this);connect(button, &QPushButton::clicked, [=](){QString path = QFileDialog::getOpenFileName(this);QFileInfo fileInfo(path); // 構造對象// 打印相關屬性qDebug() << fileInfo.fileName();qDebug() << fileInfo.suffix();qDebug() << fileInfo.path();qDebug() << fileInfo.size();qDebug() << fileInfo.isFile();qDebug() << fileInfo.isDir();// ...});
}
五:🔥 其他
① 創建刪除目錄
#include <QDir>void createDirectory(const QString &dirPath) {QDir dir;if (!dir.exists(dirPath)) {if (dir.mkpath(dirPath)) {qDebug() << "目錄創建成功:" << dirPath;} else {qDebug() << "無法創建目錄:" << dir.errorString();}} else {qDebug() << "目錄已存在:" << dirPath;}
}void deleteDirectory(const QString &dirPath) {QDir dir(dirPath);if (dir.exists()) {if (dir.rmdir(dirPath)) {qDebug() << "目錄刪除成功:" << dirPath;} else {qDebug() << "無法刪除目錄:" << dir.errorString();}} else {qDebug() << "目錄不存在:" << dirPath;}
}
② 選擇文件
QFileDialog::getOpenFileName() 函數可以用來打開文件選擇對話框,讓用戶選擇文件。
#include <QApplication>
#include <QFileDialog>
#include <QPushButton>
#include <QWidget>
#include <QVBoxLayout>
#include <QMessageBox>class FileSelector : public QWidget {
public:FileSelector() {QPushButton *button = new QPushButton("選擇文件", this);QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(button);// 點擊按鈕時打開文件選擇器connect(button, &QPushButton::clicked, this, &FileSelector::selectFile);}private slots:void selectFile() {QString fileName = QFileDialog::getOpenFileName(this, tr("打開文件"), "", tr("所有文件 (*.*);;文本文件 (*.txt)"));if (!fileName.isEmpty()) {QMessageBox::information(this, tr("選擇的文件"), fileName);}}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);FileSelector window;window.setWindowTitle("文件選擇示例");window.resize(300, 100);window.show();return app.exec();
}
說明:
QFileDialog::getOpenFileName():用于打開單個文件選擇對話框。
參數解釋:
- 第一個參數是父窗口。
- 第二個參數是對話框標題。
- 第三個參數是默認路徑。
- 第四個參數是過濾器,用于指定可以選擇的文件類型。
③ 選擇文件夾
QFileDialog::getExistingDirectory() 用來讓用戶選擇文件夾
#include <QApplication>
#include <QFileDialog>
#include <QPushButton>
#include <QWidget>
#include <QVBoxLayout>
#include <QMessageBox>class FolderSelector : public QWidget {
public:FolderSelector() {QPushButton *button = new QPushButton("選擇文件夾", this);QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(button);// 點擊按鈕時打開文件夾選擇器connect(button, &QPushButton::clicked, this, &FolderSelector::selectFolder);}private slots:void selectFolder() {QString folderName = QFileDialog::getExistingDirectory(this, tr("選擇文件夾"), "");if (!folderName.isEmpty()) {QMessageBox::information(this, tr("選擇的文件夾"), folderName);}}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);FolderSelector window;window.setWindowTitle("文件夾選擇示例");window.resize(300, 100);window.show();return app.exec();
}
- 注意:QFileDialog::getExistingDirectory():用于打開選擇文件夾的對話框。
④ 選擇多個文件
如果你想讓用戶一次選擇多個文件,可以使用
QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("選擇多個文件"), "", tr("所有文件 (*.*);;圖片文件 (*.png *.jpg)"));if (!fileNames.isEmpty()) {for (const QString &fileName : fileNames) {// 處理每個文件qDebug() << "選擇的文件:" << fileName;}
}
上面三個的區別如下:
名稱 | 作用 |
---|---|
QFileDialog::getOpenFileName() | 選擇單個文件 |
QFileDialog::getExistingDirectory() | 選擇文件夾 |
QFileDialog::getOpenFileNames() | 選擇多個文件 |
這段代碼允許用戶同時選擇多個文件,返回的是 QStringList,可以遍歷進行處理。
⑤ 過濾文件類型
在文件選擇對話框中,可以使用過濾器來限制用戶選擇某些特定類型的文件
QString fileName = QFileDialog::getOpenFileName(this, tr("打開文件"), "", tr("圖像文件 (*.png *.jpg);;文本文件 (*.txt);;所有文件 (*.*)"));
六:🔥 共勉
😋 以上就是我對 【Qt】文件
的理解, 覺得這篇博客對你有幫助的,可以點贊收藏關注支持一波~ 😉