Qt_day7_文件IO

目录

文件IO

1. QFileDialog 文件对话框(熟悉)

2. QFileInfo 文件信息类(熟悉)

3. QFile 文件读写类(掌握)

4. UI操作与耗时操作(掌握)

5. 多线程(掌握)

5.1 复现未响应

5.2 创建并启动线程

5.3 异步刷新

5.4 停止线程

6. 数据持久化(掌握)


文件IO

本章主要使用Qt配合UI实现文件IO的功能,编程目标是实现一个文件拷贝器。

1. QFileDialog 文件对话框(熟悉)

    与QMessageBox一样,QFileDialog继承了QDialog,是一个用于选择要打开或保存的文件(目录)的模态对话框。

    因此也使用静态成员函数进行弹窗,对话框的结果(选择的文件或目录的路径)也通过返回值表达。

// 获得要打开或保存的单文件路径
// 参数1:父窗口
// 参数2:windowTitle属性
// 参数3:打开窗口时所在的路径,默认为构建目录
// 参数4:文件类型过滤器
// 返回值:选择的文件路径,选择失败返回空字符串
QString QFileDialog::​getOpen(Save)FileName(
                        QWidget * parent = 0, 
                        const QString & caption = QString(), 
                        const QString & dir = QString(), 
                        const QString & filter = QString())

需要注意的是,QFileDialog是一个纯UI类,本身不具备任何IO能力。

    通过网盘分享的文件:Day5_24072_Copy (2).zip

链接: https://pan.baidu.com/s/1vu6lqbYWGXf3vDGNF8Aqig 提取码: 2dxs

--来自百度网盘超级会员v7的分享

2. QFileInfo 文件信息类(熟悉)

    此类的使用只需要获得对象后调用各种成员函数返回所需信息即可,包括但不限于以下函数:

// 构造函数
// 参数:文件路径
QFileInfo::​QFileInfo(const QString & file)
// 上次修改日期和时间
// 返回值:包含修改日期和时间的QDateTime对象
QDateTime QFileInfo::​lastModified() const
// 返回文件大小的字节数,访问失败返回0
qint64 QFileInfo::​size() const
// 返回文件的可读性
bool QFileInfo::​isReadable() const

通过网盘分享的文件:Day5_24072_Copy (3).zip

链接: https://pan.baidu.com/s/1rRtGatf7XkXDZn0Q050bhQ 提取码: acej

--来自百度网盘超级会员v7的分享

3. QFile 文件读写类(掌握)

    QFile类间接继承了QIODevice类,QIODevice是Qt所有IO类的基类,内部包含了最基础的IO接口。

    QFile类可以对文件和目录进行IO操作,本节中标记QIODevice类的函数在后续其他派生类中通用。

相关函数如下:

// 构造函数
// 参数为文件路径
QFile::​QFile(const QString & name)
// 打开读写流
// 参数:打开模式
// 返回值:打开是否成功
bool QIODevice::​open(OpenMode mode)  
// 判断数据流是否处于尾部
bool QIODevice::​atEnd() const
// 读取数据
// 参数:一次性读取的最大字节数
// 返回值:携带读取数据的字节数组,QByteArray是Qt的字节数组类
QByteArray QIODevice::​read(qint64 maxSize)
// 写出数据
// 参数:要写出的数据
// 返回值:实际写出的写出的字节数,-1表示错误
qint64 QIODevice::​write(const QByteArray & byteArray)
// 关闭流
void QIODevice::​close()
// 清空输出缓存区
// 返回值为是否成功
bool QFileDevice::​flush()
// 返回流数据的字节数
qint64 QIODevice::​size() const

通过网盘分享的文件:Day5_24072_Copy (4).zip

链接: https://pan.baidu.com/s/1x1z03C3QOh5L-w62pkZoow 提取码: fmx4

--来自百度网盘超级会员v7的分享

【思考】为何上面的代码在处理大文件时有时候会卡顿?

线程阻塞。

4. UI操作与耗时操作(掌握)

     在默认情况下,Qt只有一个线程,也被成为主线程(UI线程),此线程主要的任务保证Qt程序正常执行、UI正常显示与交互。

    但是一些耗时操作(例如IO或其他复杂算法),如果在主线程中执行,就会导致主线程原本的工作被阻塞,程序就会出现“假死”状态。

    操作系统检测到程序出现“假死”状态,并不能确定程序是真死还是假死,因此弹窗让用户自行判断。

5. 多线程(掌握)

5.1 复现未响应

    使用线程类QThread的睡眠函数可以非常简单且精准的模拟阻塞:

// 强制当前线程睡眠一段时间
// 参数为睡眠的秒数
void QThread::​sleep(unsigned long secs)

通过网盘分享的文件:Day6_24072_QThread.zip

链接: https://pan.baidu.com/s/1VfOpkZnVHkNKWPz0AIcEHw 提取码: y1f8

--来自百度网盘超级会员v7的分享

5.2 创建并启动线程

    创建并启动一个子线程的操作步骤如下:

1. 选中项目名称,鼠标右键,点击“添加新文件”。

2. 按照下图所示进行操作。

3. 设置继承结构。

4. 项目管理界面,直接点击“完成”。可以看到对应的文件。

5. 自定义线程类的头文件和源文件还需要修改。

6. 进入自定义线程类的头文件,覆盖基类QThread的run函数。

// 此函数相当于子线程的主函数,调用start函数后,新创建的线程自动调用此函数。
void  QThread::​run()                [protected virtual]

7. 在run函数的函数体中,编写子线程要执行的逻辑。需要注意的是,子线程不能执行任何UI操作,如果子线程的run函数需要用到UI的相关参数,需要主线程(父对象)给子线程(子对象)传参(成员函数)。

8. 在主线程中创建子线程对象,并调用start函数启动子线程。

// 启动子线程
// 参数:子线程的优先级
void QThread::​start(Priority priority = InheritPriority) [slot]

通过网盘分享的文件:Day6_24072_QThread (2).zip

链接: https://pan.baidu.com/s/1USSDUQ7S8vyuKn4kO0vr3A 提取码: 79v7

--来自百度网盘超级会员v7的分享

5.3 异步刷新

    在实际的开发中,两个线程通常要进行数据交互,相比于5.2节,更常见的场景是异步刷新。异步刷新指的是,子线程执行耗时操作,主线程根据子线程耗时操作的参数在UI进行刷新。

异步刷新问题可以归纳为子线程给主线程传参问题,即子对象给父对象传参——信号槽。

    通过网盘分享的文件:Day6_24072_QThread (3).zip

  链接: https://pan.baidu.com/s/1UwbCf3XG8q8jE5dP2Vvlcg 提取码: zenk

--来自百度网盘超级会员v7的分享

5.4 停止线程

停止线程的一些方法:

  • 调用terminate函数

// 强行停止线程,比较危险,不推荐使用
void QThread::​terminate()                        [slot]

  • 使用标志位

可以在耗时的循环体中添加标志位,通过停止循环间接让run函数执行完,达到停止线程的效果。

通过网盘分享的文件:Day6_24072_QThread (4).zip

链接: https://pan.baidu.com/s/1VrWJBN5ArcEVKI_sg4mkSw 提取码: fztv

--来自百度网盘超级会员v7的分享

【任务】

1. 实现多线程文件拷贝器,解决大文件卡顿问题。

通过网盘分享的文件:Day5_24072_Copy (5).zip

链接: https://pan.baidu.com/s/1aS-L9ezNivvfiHJwHeluHw 提取码: i3u3

--来自百度网盘超级会员v7的分享

2. 自学数据库,并完成数据库的电子词典作业。

Qt数据库 · 华清远见工作空间 《Qt数据库》

6. 数据持久化(掌握)

    数据持久化:将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。

    之前数据库就是一种数据持久化的方式,但是虽然嵌入式使用的SQLite数据库已经是轻量级数据库,但是相对于其他技术,还是一种比较“重”的数据持久化方式。

Qt中提供比数据库更轻量级的数据持久化方式——QSettings

相关函数如下:

// 构造函数
// 参数1:存储文件的名称,默认为构建目录
// 参数2:存储格式
// 参数3:父对象
QSettings::​QSettings(const QString & fileName, Format format, QObject * parent = 0)
// 设置INI文件的编码,建议使用UTF-8
// 参数:编码字符串
void QSettings::​setIniCodec(const char * codecName)
// 开始存储,相同类型数据建议使用此函数,以数组方式存储
// 参数:数组的名称
void QSettings::​beginWriteArray(const QString & prefix)
// 开始存储,不同类型的数据建议使用此函数(相同类型也可以,但是性能不如上面的好),以组方式存储
// 参数:组的名称
void QSettings::​beginGroup(const QString & prefix)
// 在组中添加键值对
// 参数1:键
// 参数2:值
void QSettings::​setValue(const QString & key, const QVariant & value)
// 结束数组/组的存储
void QSettings::​endArray()
void QSettings::​endGroup()
// 根据键获得值
// 参数1:键
// 参数2:如果取出失败的默认值
// 返回值:值
QVariant QSettings::​value(const QString & key, const QVariant & defaultValue = QVariant()) const

通过网盘分享的文件:Day7_24072_QSettings.zip

链接: https://pan.baidu.com/s/16KOWXPZ7Lc1UnA07HycQLw 提取码: 22ky

--来自百度网盘超级会员v7的分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/917147.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[论文笔记]An LLM Compiler for Parallel Function Calling

引言 今天带来一篇优化函数调用的论文笔记——An LLM Compiler for Parallel Function Calling。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 当前的函数(工具)调用方法通常需要对每个函数进行顺序推理和操作&…

网络性能测试

一、iperf网络性能测试工具 测试udp丢包率 在服务器启动 iperf 服务端 iperf -p 9000 -s -u -i 1参数说明: -p : 端口号 -s : 表示服务端 -u : 表示 udp 协议 -i : 检测的时间间隔(单位,秒) 在客户端,启动 iperf 客户端 iperf -c xxx.xxx.14…

Rust语言在系统编程中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 引言 Rust 概述 定义与原理 发展历程 Ru…

1-Equity-Transformer:求解NP-Hard Min-Max路由问题的顺序生成算法(AAAI-24)(完)(code)

文章目录 AbstractIntroduction问题表述Methodology多智能体位置编码公平上下文编码训练方案ExperimentsmTSP的性能评估mPDP的性能评估Related WorkConclusionAbstract 最小最大路由问题旨在通过智能体合作完成任务来最小化多个智能体中最长行程的长度。这些问题包括对现实世界…

数字后端教程之Innovus report_property和get_property使用方法及应用案例

数字IC后端实现Innovus中使用report_property可以报告出各种各样object的属性,主要有cell,net,PG Net,Pin,时钟clock,时序库lib属性,Design属性,timing path,timin arc等…

【Vitepress报错】Error: [vitepress] 8 dead link(s) found.

原因 VitePress 在编译时,发现 死链接(dead links) 会构建失败!具体在哪我也找不到… 解决方案 如图第一行蓝色提示信息,设置 Vitepress 属性 ignoredeadlinks 为 true 可忽略报错。 .vuepress/config.js export default defineConfig(…

【开源风云】从若依系列脚手架汲取编程之道(七)

📕开源风云系列 本篇文字量巨大,甚至在发表编辑之时造成编辑器卡顿,哈哈,最近在忙人生的另一项规划,文章更新就逐渐缓慢了,希望我们都逐渐走向自己的道路呀! 🍊本系列将从开源名将若…

Docker+Django项目部署-从Linux+Windows实战

一、概述 1. 什么是Docker Docker 是一个开源的应用容器引擎,支持在win、mac、Linux系统上进行安装。可以帮助我们在一台电脑上创建出多个隔离的环境,比传统的虚拟机极大的节省资源 。 为什么要创建隔离的环境? 假设你先在有一个centos7.…

[项目代码] YOLOv5 铁路工人安全帽安全背心识别 [目标检测]

YOLOv5是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv5具有更高的…

蓝桥杯备赛(持续更新)

16届蓝桥杯算法类知识图谱.pdf 1. 格式打印 %03d:如果是两位数,将会在前面添上一位0 %.2f:会保留两位小数 如果是long,必须在数字后面加上L。 2. 进制转化 2.1. 十进制转任意进制: 十进制转任意进制时&#xff…

使用Element UI实现前端分页,及el-table表格跨页选择数据,切换分页保留分页数据,限制多选数量

文章目录 一、前端分页1、模板部分 (\<template>)2、数据部分 (data)3、计算属性 (computed)4、方法 (methods) 二、跨页选择1、模板部分 (\<template>)2、数据部分 (data)3、方法 (methods) 三、限制数量1、模板部分 (\<template>)2、数据部分 (data)3、方法…

ThriveX 博客管理系统前后端项目部署教程

前端 前端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Blog 控制端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Admin Vercel 首先以 Vercel 进行部署&#xff0c;两种方式部署都是一样的&#xff0c;我们以前端项目进行演示 首先我们先…

使用electron-egg把vue项目在linux Ubuntu环境下打包并安装运行

electron-egg一个入门简单、跨平台、企业级桌面软件开发框架https://www.kaka996.com/electron-egg 跳转地址 1,使用 git下载代码到本地,如果没有git需要进行安装 # gitee git clone https://gitee.com/dromara/electron-egg.git # github git clone https://github.com/dro…

力扣-Mysql-3322- 英超积分榜排名 III(中等)

一、题目来源 3322. 英超积分榜排名 III - 力扣&#xff08;LeetCode&#xff09; 二、数据表结构 表&#xff1a;SeasonStats --------------------------- | Column Name | Type | --------------------------- | season_id | int | | team_id …

深度学习基础—Beam search集束搜索

引言 深度学习基础—Seq2Seq模型https://blog.csdn.net/sniper_fandc/article/details/143781223?fromshareblogdetail&sharetypeblogdetail&sharerId143781223&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 上篇博客讲到&#xff0c;贪心算…

vueRouter路由切换时实现页面子元素动画效果, 左右两侧滑入滑出效果

说明 vue路由切换时&#xff0c;当前页面左侧和右侧容器分别从两侧滑出&#xff0c;新页面左右分别从两侧滑入 效果展示 路由切换-滑入滑出效果 难点和踩坑 现路由和新路由始终存在一个页面根容器&#xff0c;通过<transition>组件&#xff0c;效果只能对页面根容器有效…

【EasyExcel】复杂导出操作-自定义颜色样式等(版本3.1.x)

文章目录 前言一、自定义拦截器二、自定义操作1.自定义颜色2.合并单元格 三、复杂操作示例1.实体(使用了注解式样式)&#xff1a;2.自定义拦截器3.代码4.最终效果 前言 本文简单介绍阿里的EasyExcel的复杂导出操作&#xff0c;包括自定义样式&#xff0c;根据数据合并单元格等。…

集群搭建高可用

contos7.9 部署3节点 hadoop3.4 高可用集群 contos7.9 部署3节点 hadoop3.4 高可用集群环境信息Hadoop与Zookeeper的版本对应关系服务器角色分配使用端口服务器配置配置免密登录服务器配置初始化 init_server.sh配置主机名映射所有节点配置 hosts文件 hadoop 安装环境配置下载安…

Pycharm 配置 Poetry

Python 环境安装 参考以下&#xff1a; 官网安装步骤 CODA方式安装 Poetry 安装 Poetry在windows下的安装使用 1.下载软件包 下载地址 2.获取安装脚本下载地址 3.使用命令安装 打开cmd&#xff0c;进入安装包和脚本文件所在目录&#xff0c;执行命令&#xff1a; python …

卡尔曼滤波:从理论到应用的简介

卡尔曼滤波&#xff08;Kalman Filter&#xff09;是一种递归算法&#xff0c;用于对一系列噪声观测数据进行动态系统状态估计。它广泛应用于导航、控制系统、信号处理、金融预测等多个领域。本文将介绍卡尔曼滤波的基本原理、核心公式和应用案例。 1. 什么是卡尔曼滤波&#x…