QT——文件IO

news/2025/3/5 2:23:34/

QFile 类

构造函数

QFile() 无参构造
    仅仅构建一个QFile 对象,不设定文件名

QFile(文件名)
    构建一个QFile对象的同时,设定文件名
    但是注意,仅仅设定文件名,并不会打开该文件

设定文件名

QFile file
file.setFileName(文件名)
并不会打开

打开文件

file.open(打开模式)

文件写

qint64 write(const char *data, qint64 maxSize)

    file.write(数据,数据长度)//将data,最多maxSize个字节,写入file代表的文件中 

qint64 write(const char *data)

    file.write(数据)//将data,到结束符为止,写入file代表的文件中 

 qint64 write(const QByteArray &byteArray)

    QByteArray本质是c语言的字符数组,做一段内存来管理

我们的数据一般是一个 QString 对象
    so要将一个 QString 对象转换成 QByteArray 对象:
    
    QString  str = "hello"//QString,有toLocal8Bit() :将QString转换成 QByteArray
    QByteArray   qarr = str.toLocal8Bit();

class Widget : public QWidget
{
public:Widget(QWidget *parent = nullptr);~Widget();void save_data(const QString &filename,const QString &data);private:Ui::Widget *ui;QFile file;
};Widget::~Widget()
{QString name=ui->lineEdit->text();save_data("D:/name.text",name);delete ui;
}void Widget::save_data(const QString &filename, const QString &data)
{file.setFileName(filename);file.open(QFile::WriteOnly);file.write(data.toLocal8Bit());file.close();
}

文件读 

qint64 read(char *data, qint64 maxSize)

    char buf[64] = {0}
    file.read(buf,64)//从file文件中读取最多64个字节的数据,并且将读取到的数据写入buf中
    返回读取到的数据的字节数

QByteArray read(qint64 maxSize)

    QByteArray   qarr = file.read(64)// 从file文件中,读取最多64个字节的数据,并且将读取到的数据,构建成一个QByteArray对象后返回

将  QByteArray 数据,转换成 QString 数据
        1:在QByteArray 寻找,返回值是 QString,函数名是toXXXX,形参没有的函数
        2:在QString的构造函数,寻找参数为 QByteArray 的构造函数
            不支持中文
        3:在QString的静态方法,寻找返回值为 QString,参数是 QByteArray的函数
           找到 fromLocal8Bit(),支持中文

QByteArray    readAll()

    QByteArray arr = file.readAll()// 读取文件中的全部数据
//将读取到的数据,构建成 QByteArray 后返回

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QString name=load_data("D:name.text");ui->lineEdit->setText(name);
}QString Widget::load_data(const QString &filename)
{file.setFileName(filename);file.open(QFile::ReadOnly);QByteArray barr=file.readAll();QString str=QString::fromLocal8Bit(barr);file.close();return str;
}

作业

1:在注册登录的练习里面,追加一个QListWidget 项目列表
要求:点击注册之后,将账号显示到 listWidget上面去
以及,在listWidget中双击某个账号的时候,将该账号删除 

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QFile>
#include <QListWidgetItem>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void save_data(const QString &filename, const QString &data);QString load_data(const QString &filename);private slots:void on_lineEdit_textChanged(const QString &arg1);void on_lineEdit_2_textChanged(const QString &arg1);void on_pushButton_3_pressed();void on_pushButton_3_released();void on_checkBox_stateChanged(int arg1);void on_pushButton_clicked();  // 注册按钮点击事件void on_listWidget_doubleClicked(const QModelIndex &index);  // 双击删除账号void on_listWidget_itemDoubleClicked(QListWidgetItem *item);private:Ui::Widget *ui;QFile file;
};#endif // WIDGET_H#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 加载用户名QString name = load_data("D:/name.text");ui->lineEdit->setText(name);// 加载复选框状态QString ischeck = load_data("D:/ischecked.text");if (ischeck == "1") ui->checkBox->setChecked(true);// 如果复选框被选中,加载密码if (ui->checkBox->isChecked()) {QString pswd = load_data("D:/pswd.text");ui->lineEdit_2->setText(pswd);}// 初始化按钮状态QString nameText = ui->lineEdit->text();QString pswdText = ui->lineEdit_2->text();if (nameText.isEmpty() || pswdText.isEmpty()) {ui->pushButton->setEnabled(false);ui->pushButton_2->setEnabled(false);}
}Widget::~Widget()
{// 保存用户名和密码QString name = ui->lineEdit->text();QString pswd = ui->lineEdit_2->text();save_data("D:/name.text", name);save_data("D:/pswd.text", pswd);delete ui;
}void Widget::save_data(const QString &filename, const QString &data)
{file.setFileName(filename);if (!file.open(QFile::WriteOnly)) {QMessageBox::warning(this, "Error", "Failed to save file: " + filename);return;}file.write(data.toLocal8Bit());file.close();
}QString Widget::load_data(const QString &filename)
{file.setFileName(filename);if (!file.open(QFile::ReadOnly)) {return QString();  // 文件不存在时返回空字符串}QByteArray barr = file.readAll();QString str = QString::fromLocal8Bit(barr);file.close();return str;
}void Widget::on_lineEdit_textChanged(const QString &arg1)
{QString name = ui->lineEdit->text();QString pswd = ui->lineEdit_2->text();if (name.isEmpty() || pswd.isEmpty()) {ui->pushButton->setEnabled(false);ui->pushButton_2->setEnabled(false);} else {ui->pushButton->setEnabled(true);ui->pushButton_2->setEnabled(true);}
}void Widget::on_lineEdit_2_textChanged(const QString &arg1)
{QString name = ui->lineEdit->text();QString pswd = ui->lineEdit_2->text();if (name.isEmpty() || pswd.isEmpty()) {ui->pushButton->setEnabled(false);ui->pushButton_2->setEnabled(false);} else {ui->pushButton->setEnabled(true);ui->pushButton_2->setEnabled(true);}
}void Widget::on_pushButton_3_pressed()
{ui->lineEdit_2->setEchoMode(QLineEdit::Normal);
}void Widget::on_pushButton_3_released()
{ui->lineEdit_2->setEchoMode(QLineEdit::Password);
}void Widget::on_checkBox_stateChanged(int arg1)
{save_data("D:/ischecked.text", arg1 == Qt::Checked ? "1" : "0");
}void Widget::on_pushButton_clicked()//注册
{// 获取用户名QString name = ui->lineEdit->text();// 将用户名添加到 QListWidgetif (!name.isEmpty()) {ui->listWidget->addItem(name);QMessageBox::information(this, "注册成功", "账号已添加到列表!");} else {QMessageBox::warning(this, "注册失败", "用户名不能为空!");}
}void Widget::on_listWidget_doubleClicked(const QModelIndex &index)
{// 获取选中的项QListWidgetItem *item = ui->listWidget->item(index.row());if (item) {// 删除选中的项delete item;QMessageBox::information(this, "删除成功", "账号已从列表中删除!");}
}void Widget::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{}#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

 


http://www.ppmy.cn/news/1576705.html

相关文章

苹果廉价机型 iPhone 16e 影像系统深度解析

【人像拍摄差异】 尽管iPhone 16e支持后期焦点调整功能&#xff0c;但用户无法像iPhone 16系列那样通过点击屏幕实时切换拍摄主体。前置摄像头同样缺失人像深度控制功能&#xff0c;不过TrueTone原彩闪光灯系统在前后摄均有保留。 很多人都高估了 iPhone 的安全性&#xff0c;查…

C 语言在微软平台:经典与创新的交融

在编程语言的璀璨星空中&#xff0c;C 语言犹如一颗耀眼的恒星&#xff0c;散发着永恒的光芒。当这颗恒星与微软强大的平台相互辉映时&#xff0c;更是碰撞出了绚丽多彩的火花&#xff0c;构建起了一个充满无限可能的编程世界。 C 语言与微软平台的深厚渊源 C 语言诞生于 20 …

Spark任务用什么提交的

spark任务提交的方式有很多种&#xff1a; 1、使用spark_shell&#xff1a;日常做一些简单的测试&#xff0c;使用spark-shell命名就可以&#xff0c;然后通过scala语言进行查询处理 /home/hadoop/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/bin/spark-shell \ > --master spark:…

HarmonyOS学习第13天:布局进阶,从嵌套到优化

布局嵌套初体验 在 HarmonyOS 应用开发中&#xff0c;布局嵌套是构建复杂界面的重要手段。就像搭建一座高楼&#xff0c;布局嵌套能让各个界面元素有序组合&#xff0c;构建出功能丰富、层次分明的用户界面。我们以日常使用的电商 APP 为例&#xff0c;在商品展示区&#xff0c…

Kafka 主题 retention.ms 配置修改及深度问题排查指南

文章目录 Kafka 主题 retention.ms 配置修改及深度问题排查指南版本背景查看 Kafka 主题当前状态修改 retention.ms 配置的正确方式为什么不能使用 kafka-topics.sh&#xff1f;使用 kafka-configs.sh 动态更新配置 深入解析 retention 配置retention.ms 与 retention.bytes 的…

Kotlin观察者模式

观察者模式是一种设计模式&#xff0c;它定义了对象之间的一对多依赖关系&#xff0c;当一个对象改变状态时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。这种模式在许多编程场景中非常有用&#xff0c;例如事件处理、数据绑定和通知系统。 观察者模式的主要组成部…

Android中的四大组件及其生命周期

Android中的四大组件分别是Activity、Service、Content Provider和BroadcastReceiver&#xff0c;每个组件都有其特定的生命周期。以下是这些组件及其生命周期的详细介绍&#xff1a; 1. Activity 简介&#xff1a;Activity是用户操作的可视化界面&#xff0c;为用户提供了一个…

preg_replace 与 str_replace 的比较与选择

preg_replace 与 str_replace 的比较与选择 ——PHP字符串处理的核心工具深度解析 一、核心功能定位 在PHP的字符串处理中&#xff0c;str_replace和preg_replace是两种最常用的替换函数&#xff0c;但其设计目标和应用场景存在本质差异&#xff1a; str_replace 简单字符串替…