文章目录
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_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 中用于打开文件和保存文件对话框的两个函数,它们的主要区别在于其作用和用户交互方面:
-
QFileDialog::getOpenFileName()
- 用途:用于打开文件对话框,允许用户选择一个已存在的文件。
- 功能:用户可以浏览文件系统,选择一个或多个文件以供应用程序使用。
- 返回值:返回用户选择的文件的路径。
-
QFileDialog::getSaveFileName()
- 用途:用于保存文件对话框,允许用户指定一个文件路径来保存数据。
- 功能:用户可以指定文件名、文件类型和保存位置来保存数据。
- 返回值:返回用户选择的保存文件的路径。
总的来说,getOpenFileName()
用于打开已存在的文件,而 getSaveFileName()
用于保存新文件。
2.3 效果演示
最终效果如下:
3. 资源文件
上述所涉及的 代码等资源文件在👇: