QFile 类提供了读取和写入文件的接口。在嵌入式里如果需要读写文件,最简单的方法就是
用 Qfile。
QFile 是一个读写文本、二进制文件和资源的 I/O 设备。QFile 可以自己使用,也可以更方
便地与 QTextStream 或 QDataStream 一起使用。
文件名通常在构造函数中传递,但它可以在任何时候使用 setFileName()设置。不支持使用
其他分隔符(例如'\')。所以在 Windows、 Linux 或者 Mac 里文件的路径都是用'/'。不能看到
Windows 的路径是'\',我们就可以在写入的文件路径里添加这个'\'。不管操作系统是什么,QFile
的文件分隔符都是'/'。
可以使用 exists()检查文件是否存在,并使用 remove()删除文件。(更高级的文件系统相关操
作由 QFileInfo 和 QDir 提供。)用 open()打开文件,用 close()关闭文件,用 flush()刷新文件。通
常使用 QDataStream 或 QTextStream 读写数据,但也可以调用 QIODevice 继承的函数 read()、
readLine()、readAll()、write()。QFile 还继承 getChar()、putChar()和 ungetChar(),它们一次只处
理一个字符。文件的大小由 size()返回。可以使用 pos()获取当前文件位置,也可以使用 seek()
移动到新的文件位置。如果已经到达文件的末尾,则 atEnd()返回 true。
QFile::open()函数打开文件时需要传递 QIODevice::OpenModeFlag 枚举类型的参数,决定
文件以什么方式打开,QIODevice::OpenModeFlag 类型的主要取值如下:
QIODevice::ReadOnly:以只读方式打开文件,用于载入文件。
QIODevice::WriteOnly:以只写方式打开文件,用于保存文件。
QIODevice::ReadWrite:以读写方式打开。
QIODevice::Append:以添加模式打开,新写入文件的数据添加到文件尾部。
QIODevice::Truncate:以截取方式打开文件,文件原有的内容全部被删除。
QIODevice::Text:以文本方式打开文件,读取时“\n”被自动翻译为换行符,写入时字符
串结束符会自动翻译为系统平台的编码,如 Windows 平台下是“\r\n”。
这些取值可以组合,例如 QIODevice::ReadOnly | QIODevice::Text 表示以只读和文本方式
打开文件。
我们创建一个项目工程文件打开 ui 界面添加 textedit 和两个按钮,两个按钮水平布局然后和 textedit 组成垂直布局。
在 widget.h 添加 QFILE 头文件,声明 QFIle file。
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QFile>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::Widget *ui;
QFile file;
};
#endif // WIDGET_H
进入 ui 界面给按钮添加 点击槽函数,在槽函数里面添加:
void Widget::on_pushButton_clicked()
{
QString fileName = QFileDialog::getOpenFileName(this, "选择文本", "/mnt/hgfs/qt");
qDebug() << fileName << endl;
// 设置要打开的文件
file.setFileName(fileName);
// 打开文件
if (!file.open(QIODevice::ReadOnly)) {
qDebug() << "文本打开失败" << endl;
return;
}
// QString的构造函数自动转换
ui->textEdit->setPlainText(file.readAll());
// 关闭文件
file.close();
}
点击另外一个按钮添加槽函数:
void Widget::on_pushButton_2_clicked()
{
if (file.fileName().isEmpty())
return;
// 打开文件
if (!file.open(QIODevice::ReadWrite)) {
qDebug() << "文本打开失败" << endl;
return;
}
// 写文件
file.write(ui->textEdit->toPlainText().toUtf8());
// 关闭
file.close();
ui->textEdit->clear();
}
效果: