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的分享

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何管理好自己的LabVIEW项目

在LabVIEW项目开发中,项目管理对于提高开发效率、确保项目质量、减少错误和维护成本至关重要。以下从项目规划、代码管理、测试与调试、版本控制、团队协作等方面,分享LabVIEW项目管理的体会。 ​ 1. 项目规划与需求分析 关键步骤: 需求分析…

三周精通FastAPI:40 部署应用程序或任何类型的 Web API 概念

官方文档:部署概念 - FastAPI 部署概念 在部署 FastAPI 应用程序或任何类型的 Web API 时,有几个概念值得了解,通过掌握这些概念您可以找到最合适的方法来部署您的应用程序。 一些重要的概念是: 安全性 - HTTPS启动时运行重新…

【算法一周目】双指针(1)

目录 1.双指针介绍 2.移动零 解题思路 C代码实现 3.复写零 解题思路 C代码实现 4.快乐数 解题思路 C代码实现 5.盛水最多的容器 解题思路 C代码实现 1.双指针介绍 常见的双指针有两种形式,一种是对撞指针,一种是快慢指针。 对撞指针&#x…

ARXML汽车可扩展标记性语言规范讲解

ARXML: Automotive Extensible Markup Language (汽车可扩展标记语言) xmlns: Xml name space (xml 命名空间) xsd: Xml Schema Definition (xml 架构定义) 1、XML与HTML的区别,可扩展。 可扩展,主要是…

自监督学习:机器学习的未来新方向

引言 自监督学习(Self-Supervised Learning, SSL)是近年来机器学习领域的一个重要发展方向,迅速成为许多研究和应用的热点。与传统的监督学习不同,自监督学习利用未标注数据,通过设计自我生成标签的任务,帮…

FFMPEG录屏(22)--- Linux 下基于X11枚举所有显示屏,并获取大小和截图等信息

众人拾柴火焰高,github给个star行不行? open-traa/traa traa is a versatile project aimed at recording anything, anywhere. The primary focus is to provide robust solutions for various recording scenarios, making it a highly adaptable tool…

多媒体信息检索

文章目录 一、绪论二、文本检索 (Text Retrieval)(一) 索引1.倒排索引2.TF-IDF (二) 信息检索模型 (IR模型,Information Retrieval)1.布尔模型 (Boolean模型)(1)扩展的布尔模型 (两个词)(2)P-Norm模型 (多个词) 2.向量空间模型 (Vector Space Model,VSM)…

MySql-8.0.40安装详细教程

文章目录 原创下载安装包安装配置初始化MySQL数据库安装mysql服务并启动启动MySQL服务连接MySQL配置环境变量 原创 MySql-8.0.26安装详细教程(保姆级) 下载安装包 MySQL Community Downloads 直接到选择MySQL Community Server版本页面 MySQL Commun…

openai Realtime API (实时语音)

https://openai.com/index/introducing-the-realtime-api/ 官方demo https://github.com/openai/openai-realtime-console 官方demo使用到的插件 https://github.com/openai/openai-realtime-api-beta?tabreadme-ov-file 装包配置 修改yarn.lock 这个包是从github下载的 &q…

杨辉三角-一维数组与二维数组解法

这种问题是很有规律的 这里 总结一下 这类问题输出&#xff1a;对称 且数据相同的很多 就比如首位都是1 如果计算中间值遇到困难 可以试着把边界值单独输出 一维数组 // // Created by 徐昌真 on 2024/11/11. // #include <stdio.h> //一维数组 int main() {int n; /…

无人机反制技术与方法:主动防御,被动防御技术原理详解

无人机反制技术与方法主要分为主动防御和被动防御两大类&#xff0c;以下是关于这两类防御技术的原理详解&#xff1a; 主动防御技术原理 主动防御系统旨在通过直接干扰或摧毁来攻击入侵的无人机。这类系统通常包括电子干扰、激光武器、定向能武器以及硬杀伤手段&#xff08;如…

计算机毕业设计Python+图神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

小白初入Android_studio所遇到的坑以及怎么解决

1. 安装Android_studio 参考&#xff1a;Android Studio 安装配置教程 - Windows(详细版)-CSDN博客 Android Studio超级详细讲解下载、安装配置教程&#xff08;建议收藏&#xff09;_androidstudio-CSDN博客 想下旧版本的android_studio的地址&#xff08;仅供参考&#xf…

020_Servlet_Mysql学生选课系统(新版)_lwplus87

摘 要 随着在校大学生人数的不断增加&#xff0c;教务系统的数据量也不断的上涨。针对学生选课这一环节&#xff0c;本系统从学生网上自主选课以及课程发布两个大方面进行了设计&#xff0c;基本实现了学生的在线信息查询、选课功能以及教师对课程信息发布的管理等功能&…

Vue Cli 脚手架目录文件介绍

小试牛刀 //vetur高亮; vuetab 快速生成 <template><div class"box">我是个盒子<button click"fn">按钮</button></div> </template><script> export default {methods:{fn(){alert("Hello Vue")}} …

[安洵杯 2019]easy_web 详细题解

知识点: 编码转换 命令执行 linux空格_关键字绕过 打开页面 发现url 是 /index.php?imgTXpVek5UTTFNbVUzTURabE5qYz0&cmd 有img参数和cmd参数 cmd参数是没赋值的,随便赋值为123456 页面没有反应 鼠标移动到图片下面时发现有东西,当然直接查看页面源代码也可以发现 尝…

完整培训教程:骨折图像分割

骨折图像分割系统源码&#xff06;数据集分享 [yolov8-seg-efficientViT&#xff06;yolov8-seg-C2f-CloAtt等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global A…

文本语义分块、RAG 系统的分块难题:小型语言模型如何找到最佳断点

文本语义分块、RAG 系统的分块难题&#xff1a;小型语言模型如何找到最佳断点&#xff1f; 转自jina最新的关于文本语义分块的分享和模型 之前我们聊过RAG 里文档分块 (Chunking) 的挑战&#xff0c;也介绍了 迟分 (Late Chunking) 的概念&#xff0c;它可以在向量化的时候减…

物联网技术及其在智慧城市中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 物联网技术及其在智慧城市中的应用 物联网技术及其在智慧城市中的应用 物联网技术及其在智慧城市中的应用 引言 物联网概述 定义…

新的服务器Centos7.6 安卓基础的环境配置(新服务器可直接粘贴使用配置)

常见的基础服务器配置之Centos命令 正常来说都是安装一个docker基本上很多问题都可以解决了&#xff0c;我基本上都是通过docker去管理一些容器如&#xff1a;mysql、redis、mongoDB等之类的镜像&#xff0c;还有一些中间件如kafka。下面就安装一个 docker 和 nginx 的相关配置…