Qt QNetwork 下载文件
先来看一个图
说一下Qt的QNetwork 模块吧
qt提供的这个网络模块还是很好用
如果不是特别大型的项目,对网络有极高的要求,使用curl啥的,否则这个QNetwork完全满足了。
使用:
- pro += QNetwork
- vs的勾选QNetwork
我们需要使用到3个东西
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>QNetworkAccessManager
QNetworkReply
QNetworkRequest
这3个类 这里不细说,怎么理解呢
就是通过 QNetworkAccessManager 来get post put 等请求
那么具体的参数 请求的url 头啊之类的设置,都是在 QNetworkRequest 中
然后请求成功 结果 status 等等 都是返回在 QNetworkReply
清晰吧。
例子:
QNetworkAccessManager* manage;
QNetworkRequest* request;QNetworkReply* reply = manage->post(request);
看几个重要的信号
//当完成整个网络请求的闭环, QNetworkReply 包含结果。
QNetworkAccessManager ::finished(QNetworkReply*)
//比如下载文件, 是一点一点下载的, 下载到字节就会发送这个信号
QNetworkReply::readyRead
//下载的进度 当前进度:bytesReceived ,总计的字节 bytesTotal
QNetworkReply::downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
那么这种下载逻辑是怎么实现的呢 ?
很简单的
Get 的请求形式。
我给的是核心代码, 按需调整
//1. 实例化 QNetworkAccessManager对象 m_manager = new QNetworkAccessManager(this);//槽函数自己实现connect(m_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onRequestFinished(QNetworkReply*)));//2. 开始下载的实现//这个结构体的用途 看到下面就明白了typedef struct {QNetworkReply* reply = nullptr;QFile* file = nullptr;}DownloadStorage;DownloadStorage m_downloadStorage;if (m_manager){QFile* file = new QFile(fileOutputPath);if (file->open(QIODevice::WriteOnly | QIODevice::Append)){QNetworkRequest request;request.setUrl(QString("https://xxx.exe"));m_downloadStorage.reply = m_manager->get(request);m_downloadStorage.file = file;connect(m_downloadStorage.reply, &QNetworkReply::readyRead, this, &SWNetworkCore::onReadyRead);connect(m_downloadStorage.reply, &QNetworkReply::downloadProgress, this, &SWNetworkCore::onAsynDownloadProgressChanged);}}//3. onReadyRead 槽函数
void SWNetworkCore::onReadyRead()
{//在这个槽里 找到刚刚保存的file指针 一直写数据QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());if (reply && reply == m_downloadStorage.reply){m_downloadStorage.file->write(reply->readAll());qDebug() << "write";}
}
//4. 这里就是下载进度 UI自己更改显示就好了
&SWNetworkCore::onAsynDownloadProgressChangedqint64 kbTotal = bytesTotal / 1024;qint64 mbTotal = kbTotal / 1024;qint64 kbReceived = bytesReceived / 1024;qint64 mbReceived = kbReceived / 1024;//5.onRequestFinished(QNetworkReply* reply)
onRequestFinished(QNetworkReply* reply)
{if (!reply){return;}if (reply->error() != QNetworkReply::NoError|| reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() != 200){//errorreply->deleteLater();return;}//把下载文件的 file close 然后 删除if (m_downloadStorage.reply && m_downloadStorage.reply == reply){if (m_downloadStorage.file){m_downloadStorage.file->close();delete m_downloadStorage.file;m_downloadStorage.file = nullptr;}reply->deleteLater();
}
在来理解一下,就分为几步骤
//1.开始下载
QNetworkRequest = manage->get(QNetworkRequest);
//2.下载途中一直向文件中写数据
在文件下载的槽中 onReadyRead 进行file 的write
//3.更新UI
在 downloadProgress 槽中 进行UI的进度绘制
//4.下载完成
在 onRequestFinished 完成file 指针关闭回收和最后的处理
其实其他的所有的网络请求 都可以用这3个类来完成
灵活的运用和理解
这些接口都是通过信号异步的请求, 也可以通过 QEventloop 改为同步的
错误处理啊 超时判断啊 啥啥啥 都可以基于这3个类进行封装
好了不说了
Qt QNetwork 下载文件相关推荐
- ubuntu qt linux 下载文件,Qt ------ linux(ubuntu) 下用 linuxdeployqt 打包发布程序
https://github.com/probonopd/linuxdeployqt/releases github上提供了两种安装linuxdeployqt的方法,分别是直接下载编译好的安装包安装, ...
- 在QT中采用多线程下载文件
在QT中采用多线程下载文件 这里的线程是指下载的通道(和操作系统中的线程不一样),一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务 时,使用下载者是共享带宽的, ...
- Qt之FTP上传/下载文件操作
一个简单的Ftp客户端文件上传/下载操作示例. 上传文件 QNetworkAccessManager manager; QUrl url; /* 设置通讯协议 */ url.setScheme(&qu ...
- 利用QT的QFtp类下载文件夹
工作需要下载FTP服务器上的文件夹,搜了很久发现网上几乎没有关于如何下载文件夹的资料.我改写了一个,主要是利用递归的办法,其中的一些相关细节,如果看不懂再留言问吧. FTP.h class FTP : ...
- Qt Creator下载和安装(详细教程)以及如何发布可执行程序
简介 Qt是跨平台的图形开发库,目前由Digia全资子公司 Qt Company 独立运营,官方网址: http://www.qt.io/ 也可以访问Qt项目域名:http://qt-projec ...
- ftp: connect: 没有到主机的路由_Qt之FTP上传/下载文件操作
一个简单的Ftp客户端文件上传/下载操作示例. 上传文件 QNetworkAccessManager manager; QUrl url; /* 设置通讯协议 */ url.setScheme(&q ...
- 【引用】URLDownloadToFile_VB下载文件!
这些天,写一个小程序,要将某空间服务器上的内容下载到本机使用,开始想用winsock控件,但是因为本人天赋有限,搞不定,所幸在网上发现了这样一个API函数,这个函数可是令人惊叹的好用啊! 比起win ...
- Qt 解析 DXF 文件
Qt 解析 DXF 文件 自己编写,亲测可用 使用示例 #include "dxfhelper.h" int main() {DxfHelper dxfHelper;if(dxfH ...
- qt 修改.exe文件图标_如何在没有错误的情况下更改压缩的.EXE文件上的图标
qt 修改.exe文件图标 We've previously shown you how to modify the icon on an .EXE file, but if you've tried ...
最新文章
- 记录一下CUDNN配置
- EditText / This text field does not specify an inputType or a hint
- 边缘计算用java_物联网技术和边缘计算
- 2020 8月 每日花语
- zabbix的安装(一)监控os资源:内存,cpu,io,负载,带宽
- 机器学习kaggle竞赛实战-泰坦尼克号
- elasticsearch删除索引_一文带您了解 Elasticsearch 中,如何进行索引管理(图文教程)
- SAS Viya应用简介
- 最新公布,“中国开发者大调查”第四批中奖名单来啦
- CCF NOI1140 高精度乘法
- mysql新建数据库并执行sql文件
- ffmpeg 音乐循环_背景音乐自动循环播放
- 多个pdf怎么合并成一个pdf?
- 2022年餐具行业市场分析
- 软件测试找游戏bug,豪之诺游戏测试常见Bug整理
- 今日恐慌与贪婪指数为21 恐慌程度有所缓解
- 孤尽训练营打卡日记day28--第四周总结
- #if endif 的意思
- 【分享视频资源】React JS教程
- Oracle 几种更新(Update语句)查询的方法
热门文章
- 阿里云云效平台配置持续集成--java篇
- 【红队】ATTCK - Active Scanning(主动扫描)
- javax.el.PropertyNotFoundException: 'newsLine' is an unknown bean property...
- [UVM]UVM TLM1.0 Interface归纳总结 --- 图解UVM TLM1.0 Interface
- IntelliJ IDEA中项目的包和目录结构显示设置
- [置顶]我的2011体会--不是每个程序员都是适合创业,即使你工作了十年
- 高效使用Mac标签功能
- Single Image Haze Removal Using Dark Channel Prior 基于暗原色先验的单一图像去雾方法【翻译】
- 李沐-斯坦福《实用机器学习》-02章
- php 实现店铺装修5