文章目录
- 1. 前言 - 关于Qt文件
- 1.1 QIODevice 介绍
- 1.2 QFile 介绍
- 1.2 打开文件的方式
- 2. 实例 - 记事本功能
- 2.1 功能实现
- 2.2 getOpenFileName() 与 getSaveFileName() 的区别
- 2.3 效果演示
- 3. 资源文件
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 功能实现
下面我们通过上面介绍的类等实现一个简单的记事本,包括三个功能:
- 新建窗口
- 打开文件
- 保存文件
- 首先在widget.h中对相关 信号 / 槽函数 进行声明:
class MainWindow : public QMainWindow
{Q_OBJECTpublic: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 中用于打开文件和保存文件对话框的两个函数,它们的主要区别在于其作用和用户交互方面:
-
QFileDialog::getOpenFileName()
- 用途:用于打开文件对话框,允许用户选择一个已存在的文件。
- 功能:用户可以浏览文件系统,选择一个或多个文件以供应用程序使用。
- 返回值:返回用户选择的文件的路径。
-
QFileDialog::getSaveFileName()
- 用途:用于保存文件对话框,允许用户指定一个文件路径来保存数据。
- 功能:用户可以指定文件名、文件类型和保存位置来保存数据。
- 返回值:返回用户选择的保存文件的路径。
总的来说,getOpenFileName()
用于打开已存在的文件,而 getSaveFileName()
用于保存新文件。
2.3 效果演示
最终效果如下:
3. 资源文件
上述所涉及的 代码等资源文件在👇:
QFile的使用,记事本功能的实现