目录:
case1: 调用 getOpenFileName 得到需要打开的文件路径
case2:优化 stream读取 --> 支持手动选择文件来读取
概念
QFile 是 Qt 框架中用于文件处理的一个类。它提供了读取和写入文件的功能,支持文本和二进制文件。
QFile 继承自 QIODevice ,因此它可以像其他IO设备一样使用。
主要功能
1. 文件读写: QFile 支持打开文件进行读取或写入操作
2. 文件信息:可以检索有关文件的信息,如大小、修改日期等。
3. 文件操作:提供了对文件进行重命名、移动、删除等操作的能力。
4. 错误处理: QFile 在操作文件时提供了错误处理机制,可以通过相应的函数检查和获取错误信息。
常用方法
open() :打开一个文件。需要指定模式(如只读、只写、读写等)。
close() :关闭文件。
read() 和 write() :用于读取和写入数据。
exists() :检查文件是否存在。
remove() :删除文件。
copy() :复制文件
=============================================
Tips
QT 添加头文件的快捷键 --> 选中我们需要函数/类,alt +enter
实现基本读写的case
case1 : QFile 读取文件 read():
先创建文本文件:
#include "widget.h" #include "ui_widget.h" #include <QFile> #include <QDebug> Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); } Widget::~Widget() { delete ui; } void Widget::on_btnRead_clicked() { // 打开文件 // func1 -- 构造函数直接指定 文件 //QFile qfile("F:/myqt/project_of_qt_new/test.txt"); // func2 -- 无参构造在调用setFileName 去指定文件 QFile qfile; qfile.setFileName("F:/myqt/project_of_qt_new/test.txt"); if(!qfile.open(QIODevice::ReadOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好 { qDebug()<<"Open Error"; } //读取文件 char context[100] = {'\0'}; if(-1 == qfile.read(context,100)) return; // 展示文件 qDebug()<<context; // 关闭文件 qfile.close(); }
现象输出
========================================
case 2: 添加写入按钮的槽函数 write()
void Widget::on_btnWrite_clicked()
{
// 打开
// 实例化 QFile 对象,指定要打开的文件
QFile qfile("F:/myqt/project_of_qt_new/test2.txt");
if(!qfile.open(QIODevice::WriteOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
{
qDebug()<<"Open Error";
}
// 写入
qfile.write("this is data2 for write to qtFile 写个 中文看看");
//关闭
qfile.close();
}
QTextStream的特性:
case3: QTextStream: 实现读取:
void Widget::on_strRead_clicked()
{
// 先打开文件
QFile qfile("F:/myqt/project_of_qt_new/test.txt");
if(!qfile.open(QIODevice::ReadOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
{
qDebug()<<"Open Error";
}
QTextStream in(&qfile);
in.setCodec("UTF-8"); //设置编码格式
// 读取单行
// QString context =in.read(qfile.size());
// qDebug() << context;
// 读取多行
while (!in.atEnd()) {// 当没到文件尾部
QString context =in.readLine(qfile.size());// 每次读一行
qDebug() << context;
qDebug() << "----------------";
}
qfile.close();
}
case4:QTextStream: 实现写入
void Widget::on_strWrite_clicked()
{
QFile qfile("F:/myqt/project_of_qt_new/test3.txt");
if(!qfile.open(QIODevice::WriteOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
{
qDebug()<<"Open Error";
}
QTextStream out(&qfile); // & --拷贝构造函数 -- 指向内存空间的地址
out.setCodec("UTF-8");
// out往文件里面写
out << "I write stram char to File";
qfile.close();
}
总代码(包含4个case):
#include "widget.h"
#include "ui_widget.h"
#include <QFile>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_btnRead_clicked()
{
// 打开文件
// func1 -- 构造函数直接指定 文件
QFile qfile("F:/myqt/project_of_qt_new/test.txt");
// func2 -- 无参构造在调用setFileName 去指定文件
// QFile qfile;
// qfile.setFileName("F:/myqt/project_of_qt_new/test.txt");
if(!qfile.open(QIODevice::ReadOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
{
qDebug()<<"Open Error";
}
//读取文件
int size = qfile.size(); // size() API --> 查看当前文件大小
// char context[size] = {'\0'};
char *context = new char(size);
//if(-1 == qfile.read(context,size)) return;
qfile.read(context,size);
// 展示文件
qDebug()<<context;
// 关闭文件
qfile.close();
}
void Widget::on_btnWrite_clicked()
{
// 打开
// 实例化 QFile 对象,指定要打开的文件
QFile qfile("F:/myqt/project_of_qt_new/test2.txt");
if(!qfile.open(QIODevice::WriteOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
{
qDebug()<<"Open Error";
}
// 写入
qfile.write("this is data2 for write to qtFile 测试中文");
//关闭
qfile.close();
}
void Widget::on_strRead_clicked()
{
// 先打开文件
QFile qfile("F:/myqt/project_of_qt_new/test.txt");
if(!qfile.open(QIODevice::ReadOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
{
qDebug()<<"Open Error";
}
QTextStream in(&qfile);
in.setCodec("UTF-8"); //设置编码格式
// 读取单行
// QString context =in.read(qfile.size());
// qDebug() << context;
// 读取多行
while (!in.atEnd()) {// 当没到文件尾部
QString context =in.readLine(qfile.size());// 每次读一行
qDebug() << context;
qDebug() << "----------------";
}
qfile.close();
}
void Widget::on_strWrite_clicked()
{
QFile qfile("F:/myqt/project_of_qt_new/test3.txt");
if(!qfile.open(QIODevice::WriteOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
{
qDebug()<<"Open Error";
}
QTextStream out(&qfile); // & --拷贝构造函数 -- 指向内存空间的地址
out.setCodec("UTF-8");
// out往文件里面写
out << "I write stram char to File";
qfile.close();
}
文件选择对话框 QFileDialog:
引言
为什么 需要引入 --> 前面我们对文件的操作都是使用代码来写死了,我们希望我们的路径灵活选择,QFileDialog 为我们提供了相关的功能
使用 QFileDialog 的基本步骤:
实例化:首先,创建一个 QFileDialog 对象的实例
QFileDialog dialog;
设置模式:根据需要设置对话框的模式,如打开文件、保存文件等。
dialog.setFileMode(QFileDialog::AnyFile);
设置过滤器:如果需要,可以设置文件类型过滤器,以限制用户可以选择的文件类型
dialog.setNameFilter(tr("Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML
files (*.xml)"));
显示对话框:通过调用 exec() 方法显示对话框,并在用户作出选择后执行相应的操作。
if (dialog.exec()) {
QStringList files = dialog.selectedFiles();
// 对用户选定的文件进行操作
}
通过 selectedFiles 方法获取用户选择的文件路径列表,然后对这些文件进行相应的处理。
这是使用 QFileDialog 的基本模式。Qt 也允许使用静态方法直接创建和显示对话框,例如
QFileDialog::getOpenFileName() ,这些方法更简单,但提供的自定义选项较少。
case:
case1: 调用 getOpenFileName 得到需要打开的文件路径
#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_btnQFileDialog_clicked()
{
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), // this --> 指定当前的Widget对象 ,作用打开文件
"F:/myqt/project_of_qt_new", // 默认打开的路径
tr("Text (*txt)"));//限制能打开文件的格式
qDebug() <<fileName;
}
case2:优化 stream读取 --> 支持手动选择文件来读取
void Widget::on_strRead_clicked()
{
// 先打开文件
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), // this --> 指定当前的Widget对象 ,作用打开文件
"F:/myqt/project_of_qt_new", // 默认打开的路径
tr("Text (*txt)"));//限制能打开文件的格式
QFile qfile(fileName);
if(!qfile.open(QIODevice::ReadOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
{
qDebug()<<"Open Error";
}
QTextStream in(&qfile);
in.setCodec("UTF-8"); //设置编码格式
// 读取单行
// QString context =in.read(qfile.size());
// qDebug() << context;
// 读取多行
while (!in.atEnd()) {// 当没到文件尾部
QString context =in.readLine(qfile.size());// 每次读一行
qDebug() << context;
qDebug() << "----------------";
}
qfile.close();
}
case3QFileDialog选择多个文件:
void Widget::on_btnSE_clicked()
{
QFileDialog dialog; //创建 QFileDialog 对象
dialog.setFileMode(QFileDialog::ExistingFiles); //指定模式 -- 能打开已经存在的文件 Files --> 支持同时选择多个文件
dialog.setNameFilter("*.txt"); // 过滤器,只显示 txt文件
dialog.exec(); //开始运行这个对象
QStringList qstrings = dialog.selectedFiles(); // 获取选择到的(多个)文件
for(QString str : qstrings) // 迭代的方式遍历列表
{
qDebug()<<str;
}
}
输出现象
case4: QFileDialog 创建并保存文件:
getSaveFileName API的调用
void Widget::on_btnSave_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),//设置为保存文件模式
"F:/myqt/project_of_qt_new/default.txt", // 默认打开的路径,加上/default.txt,指定默认文件名
tr("Text (*.txt *.doc)"));//限制能打开文件的格式 ,这里指定保存文件类型了,不写后缀 .txt 只写文件名也可以
qDebug()<< fileName;
QFile qfile(fileName);
if(!qfile.open(QIODevice::WriteOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
{
qDebug()<<"Open Error";
}
QTextStream out(&qfile); // & --拷贝构造函数 -- 指向内存空间的地址
out.setCodec("UTF-8");
// out往文件里面写
out << "Test of save file.";
qfile.close();
}
总代码
#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_btnQFileDialog_clicked()
{
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), // this --> 指定当前的Widget对象 ,作用打开文件
"F:/myqt/project_of_qt_new", // 默认打开的路径
tr("Text (*txt)"));//限制能打开文件的格式
qDebug() <<fileName;
}
void Widget::on_btnSE_clicked()
{
QFileDialog dialog; //创建 QFileDialog 对象
dialog.setFileMode(QFileDialog::ExistingFiles); //指定模式 -- 能打开已经存在的文件 Files --> 支持同时选择多个文件
dialog.setNameFilter("*.txt"); // 过滤器,只显示 txt文件
dialog.exec(); //开始运行这个对象
QStringList qstrings = dialog.selectedFiles(); // 获取选择到的(多个)文件
for(QString str : qstrings) // 迭代的方式遍历列表
{
qDebug()<<str;
}
}
void Widget::on_btnSave_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),//设置为保存文件模式
"F:/myqt/project_of_qt_new/default.txt", // 默认打开的路径,加上/default.txt,指定默认文件名
tr("Text (*.txt *.doc)"));//限制能打开文件的格式 ,这里指定保存文件类型了,不写后缀 .txt 只写文件名也可以
qDebug()<< fileName;
QFile qfile(fileName);
if(!qfile.open(QIODevice::WriteOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
{
qDebug()<<"Open Error";
}
QTextStream out(&qfile); // & --拷贝构造函数 -- 指向内存空间的地址
out.setCodec("UTF-8");
// out往文件里面写
out << "Test of save file.";
qfile.close();
}