马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
🌈 个人主页:Zfox_
🔥 系列专栏: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: pen() 就能创建一个文件名唯一的暂时文件,在 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() 函数可以用来打开文件选择对话框,让用户选择文件。
复制代码 阐明:
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】文件 的理解, 觉得这篇博客对你有资助的,可以点赞收藏关注支持一波~ 😉
|