当前位置: 首页 > news >正文

QT——文件IO

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();
}

 

相关文章:

QT——文件IO

QFile 类 构造函数 QFile() 无参构造 仅仅构建一个QFile 对象&#xff0c;不设定文件名 QFile(文件名) 构建一个QFile对象的同时&#xff0c;设定文件名 但是注意&#xff0c;仅仅设定文件名&#xff0c;并不会打开该文件 设定文件名 QFile file file.setFileName…...

分布式中间件:Redis介绍

目录 Redis 概述 Redis 的特点 高性能 丰富的数据结构 持久化 分布式特性 简单易用 Redis 的数据结构 字符串&#xff08;String&#xff09; 哈希&#xff08;Hash&#xff09; 列表&#xff08;List&#xff09; 集合&#xff08;Set&#xff09; 有序集合&…...

服务器和本地电脑之间如何传输文件

在服务器和本地电脑之间传输文件可以通过多种方式实现&#xff0c;常见的方法包括使用 SFTP&#xff08;安全文件传输协议&#xff09;、SCP&#xff08;安全复制协议&#xff09;、FTP&#xff08;文件传输协议&#xff09;、rsync、以及 云存储 等工具。以下是几种常见的方法…...

经验分享:用一张表解决并发冲突!数据库事务锁的核心实现逻辑

背景 对于一些内部使用的管理系统来说&#xff0c;可能没有引入Redis&#xff0c;又想基于现有的基础设施处理并发问题&#xff0c;而数据库是每个应用都避不开的基础设施之一&#xff0c;因此分享个我曾经维护过的一个系统中&#xff0c;使用数据库表来实现事务锁的方式。 之…...

嵌入式学习前要了解的基础知识

一、电压和电流 在嵌入式开发中&#xff0c;电压和电流是两个基本的电气概念&#xff0c;对于理解和设计电子电路至关重要。它们直接影响到嵌入式系统的性能、功耗、可靠性和安全性。 电压&#xff08;Voltage&#xff09; 电压是电场力推动电荷移动的能力&#xff0c;通常以…...

RTC、直播、点播技术对比|腾讯云/即构/声网如何选型 — 2025 版

前言 作为一个有多年实战经验的开发者&#xff0c;在音视频技术领域我深刻体会到 RTC&#xff08;实时通信&#xff09;、直播和点播三者的不同。虽然它们的核心都涉及音视频内容的传输&#xff0c;但在实际应用中&#xff0c;它们的技术实现、使用场景以及所面临的挑战各不相…...

《白帽子讲 Web 安全》之文件操作安全

目录 引言 &#xff08;一&#xff09;文件上传与下载漏洞概述 1.文件上传的常见安全隐患 1.1前端校验的脆弱性与服务端脚本执行危机在文件上传流程中&#xff0c;部分开发者可能会在前端使用 JavaScript 代码对文件后缀名进行简单校验&#xff0c;试图以此阻止非法文件上传…...

yolov8训练模型、测试视频

yolov8先训练生成best.pt文件&#xff0c;用这个生成的模型进行视频的测试 因为本来用的代码生成的测试视频打不开&#xff0c;格式应该是损坏了&#xff0c;或者部分帧没有正常保存吧。 修改了一下代码&#xff0c;现状可以正常打开生成的视频了。 1、训练代码train.py im…...

03.网络编程套接字(二)

文章目录 简单的TCP网络程序 服务端创建套接字 服务端绑定 服务端监听 服务端获取连接 服务端处理请求 客户端创建套接字 客户端发起请求 服务器测试 单执行流服务器的弊端 多进程版的TCP网络程序 线程池版的TCP网络程序 简单的TCP网络程序 服务端创建套接字 我…...

一周学会Flask3 Python Web开发-Flask3之表单处理WTForms安装与定义WTForms表单类

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们平时开发项目&#xff0c;都会用到表单&#xff0c;编写表单&#xff0c;提交表单&#xff0c;验证表单&#xff0c;如果…...

Git基本命令索引

GIT基本命令索引 创建代码库修改和提交代码日志管理远程操作操作分支 创建代码库 操作指令初始化仓库git init克隆远程仓库git clone 修改和提交代码 操作指令查看文件状态git status文件暂存git add文件比较git diff文件提交git commit回滚版本git reset重命名或者移动工作…...

【论文阅读笔记】SL-YOLO(2025/1/13) | 小目标检测 | HEPAN、C2fDCB轻量化模块

目录 摘要 1 引言 2 相关工作 3 方法 3.1 为小目标检测增加一个头 3.2 优化网络结构 3.3 改进轻量化模块 3.3.1 C2fDCB 3.3.2 SCDown 4 实验 4.1 数据集 4.2 实验环境 4.3 与其他模型的比较 4.4 消融研究 ▲不同网络结构的分析 ▲不同模块的分析 ▲不同降采样…...

MySQL SQL 优化专题

MySQL SQL 优化专题 1. 插入数据优化 -- 普通插入&#xff08;不推荐&#xff09; INSERT INTO tb_user VALUES(1,tom); INSERT INTO tb_user VALUES(2,cat); INSERT INTO tb_user VALUES(3,jerry);-- 优化方案1&#xff1a;批量插入&#xff08;推荐&#xff0c;不建议超过1…...

Mac上安装Pycharm

说明&#xff1a;仅供参考&#xff0c;是自己的安装流程&#xff0c;以免以后自己想不起来来看看的笔记 官网地址&#xff1a;https://www.jetbrains.com/pycharm/ 1、点击Download&#xff0c;跳转到下一个页面 2、MAC&#xff0c;选择Mac OS&#xff0c;在Pycharm Professio…...

flask框架基础入门学习教程

文章目录 前言1. 环境搭建1.1Python安装1.2选择Python开发环境1.3 创建虚拟环境&#xff08;可选但推荐&#xff09;1.4 安装 Flask 2. 第一个 Flask 应用3. 路由和视图函数3.1 基本路由3.2 动态路由3.3 路由参数类型 4. 请求和响应4.1 获取请求数据4.2 响应对象 5. 模板渲染6.…...

Qt显示一个hello world

一、显示思路 思路一&#xff1a;通过图形化方式&#xff0c;界面上创建出一个控件显示。 思路二&#xff1a;通过编写C代码在界面上创建控件显示。 二、思路一实现 点开 Froms 的 widget.ui&#xff0c;拖拽 label 控件&#xff0c;显示 hello world 即可。 qmake 基于 .…...

MySQL快速搭建主从复制

一、基于位点的主从复制部署流程 确定主库Binlog是否开启修改主从server_id主库导出数据从库导入数据确定主库备份时的位点在从库配置主库信息查看复制状态并测试数据是否同步 二、准备阶段(主库和从库配置都需要修改&#xff09; 1、确定主库Binlog是否开启 2、修改主从se…...

力扣-动态规划-674 最长连续递增序列

思路 dp数组定义&#xff1a;以i为结尾的最长连续递增序列递推公式&#xff1a; if(nums[i-1] < nums[i]) dp[i] dp[i-1] 1; dp数组初始化&#xff1a;都为1遍历顺序&#xff1a;顺序时间复杂度&#xff1a; 代码 class Solution { public:int findLengthOfLCIS(v…...

在笔记本电脑上用DeepSeek搭建个人知识库

最近DeepSeek爆火&#xff0c;试用DeepSeek的企业和个人越来越多。最常见的应用场景就是知识库和知识问答。所以本人也试用了一下&#xff0c;在笔记本电脑上部署DeepSeek并使用开源工具搭建一套知识库&#xff0c;实现完全在本地环境下使用本地文档搭建个人知识库。操作过程共…...

leetcode 94. 二叉树的中序遍历

题目如下 做了那么多道难题&#xff0c;给自己放放松。通过代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int …...

10分钟终极指南:使用Chronos时间序列预测模型快速上手

10分钟终极指南&#xff1a;使用Chronos时间序列预测模型快速上手 【免费下载链接】chronos-forecasting Chronos: Pretrained Models for Time Series Forecasting 项目地址: https://gitcode.com/GitHub_Trending/ch/chronos-forecasting 想要在几分钟内完成专业级的时…...

本地视频怎么去水印?2026 视频去水印方法与软件推荐指南

概述&#xff1a;为什么要给视频去水印 视频水印是内容平台的标识符&#xff0c;但在某些场景下会影响使用体验——比如下载的视频要用于素材库、制作集锦或进行二次编辑时&#xff0c;水印就成了累赘。本文总结了2026年最实用的本地视频去水印方法&#xff0c;涵盖手机小程序、…...

专科英语A级和B级考试历年真题试卷及答案PDF电子版

高等学校英语应用能力考试&#xff08;PRETCO&#xff09;A 级、B 级历年真题试卷及答案 PDF 电子版&#xff0c;专为高职高专、大专在校生备考整理。内容涵盖2022年、2023年、2024年、2025年 6 月、12 月全套真题&#xff0c;含听力原文、答案解析、写作范文&#xff0c;题型覆…...

python代码编译成库

一、项目结构如下&#xff1a;your_project/ ├── match/ │ ├── __init__.py # 空文件&#xff0c;声明为包 │ └── matcher.py # 包含 compete_image 类 ├── stitch/ │ ├── __init__.py # 空文件&#xff0c;声明为包 │ └── total…...

OpenHTMLtoPDF:Java生态下的专业级HTML转PDF解决方案

OpenHTMLtoPDF&#xff1a;Java生态下的专业级HTML转PDF解决方案 【免费下载链接】openhtmltopdf An HTML to PDF library for the JVM. Based on Flying Saucer and Apache PDF-BOX 2. With SVG image support. Now also with accessible PDF support (WCAG, Section 508, PDF…...

告别伪影和色偏!用AnimeGANv3把照片一键变成宫崎骏动画风(附GUI工具下载)

用AnimeGANv3打造宫崎骏动画风照片&#xff1a;零基础也能上手的终极指南 你是否也曾被宫崎骏动画中那些唯美的场景所打动&#xff1f;蓝天白云下飘动的发丝、夕阳映照中闪烁的波光&#xff0c;这些充满魔力的画面如今可以通过AnimeGANv3一键实现。不同于市面上那些会产生色偏和…...

AI写论文必备指南!4款AI论文生成工具,让论文写作事半功倍!

写期刊论文是不是让你感到特别困难&#xff1f; 面对大量的文献、繁琐的格式要求&#xff0c;以及不断的修改&#xff0c;许多学术工作者都感到效率低下。别担心&#xff0c;接下来我们将介绍4款实测的AI论文写作工具&#xff0c;它们能够帮助你轻松生成论文。从文献检索、论文…...

Perplexity名言警句搜索深度解析(2024年Q2最新API行为逆向实测报告)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Perplexity名言警句搜索深度解析&#xff08;2024年Q2最新API行为逆向实测报告&#xff09; Perplexity 在 2024 年第二季度对 /search 端点实施了细粒度的请求签名验证与上下文指纹绑定机制&#xff0…...

别再为printf发愁了!华大HC32L13x单片机串口打印的三种实战配置(Keil MDK环境)

华大HC32L13x单片机串口打印的三种高效配置方案 在嵌入式开发中&#xff0c;printf函数作为调试利器&#xff0c;其重要性不言而喻。然而&#xff0c;当您拿到华大HC32L13系列单片机官方SDK&#xff0c;按照常规ARM单片机经验配置printf时&#xff0c;却发现串口毫无反应——这…...

RollBack RX Professional 快照管理避坑指南:锁定、任务属性设置与常见误区解析

RollBack RX Professional 快照管理避坑指南&#xff1a;锁定、任务属性设置与常见误区解析 在系统维护和数据安全领域&#xff0c;快照技术已经成为保障业务连续性的重要手段。RollBack RX Professional作为一款专业的系统还原工具&#xff0c;其快照管理功能在实际应用中展现…...