01 数据文件的读取
例1.1:
利用lambda函数简单实现数据文件读取,并将内容显示于文本框
第一步:界面设计
利用Qt的ui设计界面,拖拽获取所需控件,如下图所示:
第二步:代码编写
按钮点击后,创建文件夹窗口QFileDialog,并获取文件路径信息,并在QLineEdit中显示。
利用获取的文件路径,构建文件对象QFile,并打开对应文件。
判读文件是否位于结尾,若不是则逐行读取文件内容,用1024字节的char数组存储行内容。
将获取的内容,在QTextEdit中显示,如果出现中文乱码,需要制定编码格式GBK。
Qt_08_QFile_1/Sources/Mainwindow.cpp
#include "Mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog> //打开文件夹窗口
#include <QTextCodec> //编码格式头文件
//功能:打开目标文件读取内容,并将其写入TextEdit控件中去
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->FileBtn, &QPushButton::clicked, [this](){
//获取要打开的文件名,并将文件名(包含)填入行文本框(lineEdit)
QString fileName = QFileDialog::getOpenFileName(this, "选择文件"); //打开任意路径的文件
//QString fileName = QFileDialog::getOpenFileName(this, "选择文件", "C:/"); //只能打开C盘下的文件
ui->lineEdit->setText(fileName);
//将文件的内容,全部读入文本框内(textEdit)
QFile GKW_file(fileName); //构建文件对象 对文件做相关操作
if(!GKW_file.open(QIODevice::ReadOnly)) //打开文件用于读 判断是否正常打开
{
return;
}
while(!GKW_file.atEnd()) //判断文件结尾
{
char str[1024] = {0};
GKW_file.readLine(str, sizeof str); //一行一行读入 参数1:读入的目标地址 参数2:单行读入最大长度
//ui->textEdit->append(str);
//指定为GBK,避免中文文本乱码
QTextCodec* codec = QTextCodec::codecForName("GBK");
ui->textEdit->append(codec->toUnicode(str)); //内容不断往后追加
}
GKW_file.close(); //文件关闭
});
}
MainWindow::~MainWindow()
{
delete ui;
}
运行结果如下:
1.文件选择:
2.内容读取与显示:
例1.2:
改写例1.1,利用信号与槽,实现数据文件读取,并将内容显示于文本框。通过编写自定义槽函数,并将其与按钮点击的信号相连接,触发执行
Qt_08_QFile_2/Sources/Mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
void OnFileBtnClicked(); //方法一,自己写槽函数,并写connect函数
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
Qt_08_QFile_2/Sources/Mainwindow.cpp
#include "Mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog> //打开文件夹窗口
#include <QTextCodec> //编码格式头文件
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->FileBtn, &QPushButton::clicked,this, &MainWindow::OnFileBtnClicked);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::OnFileBtnClicked() //文件读取
{
QString fileName = QFileDialog::getOpenFileName(this, "选择文件");
ui->lineEdit->setText(fileName);
QFile file_01(fileName);
if(!file_01.open(QIODevice::ReadOnly))
{
return;
}
while(!file_01.atEnd())
{
char str[1024];
file_01.readLine(str, sizeof(str));
QTextCodec* codestyle = QTextCodec::codecForName("GBK");
ui->textEdit->append(codestyle->toUnicode(str));
}
file_01.close();
}
例1.3:
改写例1.2,利用ui设计界面的转到槽,绑定并创建槽函数,无需手动编写connect()函数。选中按钮控件,右键->选择“转到槽”
- 利用字节数组QByteArray,读取文件内容,按行读取并追加存入QByteArray。
- 字节数组QByteArray为QString的底层类,相当于数据表,里面存储元素为char类型。
- QString类型依赖于QByteArray,可以用后者构造前者,QString(QByteArray)。
Qt_08_QFile_2/Sources/Mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked(); //方法二,在ui界面选择按钮,转到槽,省略写connect函数
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
Qt_08_QFile_2/Sources/Mainwindow.cpp
#include "Mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog> //打开文件夹窗口
#include <QTextCodec> //编码格式头文件
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked() //文件2读取
{
QString fileName = QFileDialog::getOpenFileName(this, "选择文件");
ui->lineEdit->setText(fileName);
QFile file_01(fileName);
if(!file_01.open(QIODevice::ReadOnly))
{
return;
}
QByteArray arr; //字节数组(字符动态数组,每个字节相当于一个char),不需考虑每行长度
while(!file_01.atEnd())
{
arr += file_01.readLine();
}
QTextCodec* codestyle = QTextCodec::codecForName("GBK"); //设置编码方式,防止中文乱码
ui->textEdit->setText(codestyle->toUnicode(arr));
file_01.close();
}
02 数据文件的写入
例2.1:
将文本框内读取到的内容,另存为一个新的文件
第一步:界面设计
利用Qt的ui设计界面,拖拽获取所需控件,如下图所示:
第二步:代码编写
- 利用QFileDialog::getSaveFileName()创建保存的文件路径名称(可设置默认路径,保存文件类型等)。
- 利用获取的保存文件路径名称作为参数,创建用于保存的文件对象QFile。
- 打开文件对象,打开模式为写入模式(QIODevice::WriteOnly)。
- 获取文本框内容之后,利用toUtf8()函数,将QString类型转换为QByteArray类型,再写入。
Qt_08_QFile_2/Sources/Mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
void OnFileBtnClicked();
void on_SaveAsBtn_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
Qt_08_QFile_2/Sources/Mainwindow.cpp
#include "Mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog> //打开文件夹窗口
#include <QTextCodec> //编码格式头文件
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->FileBtn, &QPushButton::clicked,this, &MainWindow::OnFileBtnClicked);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::OnFileBtnClicked() //文件读取
{
QString fileName = QFileDialog::getOpenFileName(this, "选择文件");
ui->lineEdit->setText(fileName);
QFile file_01(fileName);
if(!file_01.open(QIODevice::ReadOnly))
{
return;
}
while(!file_01.atEnd())
{
QTextCodec* codestyle = QTextCodec::codecForName("GBK");
char str[1024];
file_01.readLine(str, sizeof(str));
ui->textEdit->append(codestyle->toUnicode(str));
}
file_01.close();
}
//文件写入(另存为)
void MainWindow::on_SaveAsBtn_clicked()
{
// QFileDialog::getSaveFileName(this, "另存为", "C:/未命名.txt", "*.txt");
QString filename = QFileDialog::getSaveFileName(this, "另存为", "未命名.docx", "*.docx");
QFile file(filename);
if(!file.open(QIODevice::WriteOnly)) //打开文件,用于写
{
return;
}
QString str01 = ui->textEdit->toPlainText(); //使用QString接一下textEdit内容
file.write(str01.toUtf8()); //.toUtf8()可以将QString转化为QByteArray
file.close();
}
运行结果如下:
1.文件保存: