先来看一个图

说一下Qt的QNetwork 模块吧
qt提供的这个网络模块还是很好用
如果不是特别大型的项目,对网络有极高的要求,使用curl啥的,否则这个QNetwork完全满足了。

使用:

  1. pro += QNetwork
  2. 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 下载文件相关推荐

  1. ubuntu qt linux 下载文件,Qt ------ linux(ubuntu) 下用 linuxdeployqt 打包发布程序

    https://github.com/probonopd/linuxdeployqt/releases github上提供了两种安装linuxdeployqt的方法,分别是直接下载编译好的安装包安装, ...

  2. 在QT中采用多线程下载文件

    在QT中采用多线程下载文件 这里的线程是指下载的通道(和操作系统中的线程不一样),一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务 时,使用下载者是共享带宽的, ...

  3. Qt之FTP上传/下载文件操作

    一个简单的Ftp客户端文件上传/下载操作示例. 上传文件 QNetworkAccessManager manager; QUrl url; /* 设置通讯协议 */ url.setScheme(&qu ...

  4. 利用QT的QFtp类下载文件夹

    工作需要下载FTP服务器上的文件夹,搜了很久发现网上几乎没有关于如何下载文件夹的资料.我改写了一个,主要是利用递归的办法,其中的一些相关细节,如果看不懂再留言问吧. FTP.h class FTP : ...

  5. Qt Creator下载和安装(详细教程)以及如何发布可执行程序

    简介 Qt是跨平台的图形开发库,目前由Digia全资子公司 Qt Company 独立运营,官方网址:  http://www.qt.io/  也可以访问Qt项目域名:http://qt-projec ...

  6. ftp: connect: 没有到主机的路由_Qt之FTP上传/下载文件操作

    ​一个简单的Ftp客户端文件上传/下载操作示例. 上传文件 QNetworkAccessManager manager; QUrl url; /* 设置通讯协议 */ url.setScheme(&q ...

  7. 【引用】URLDownloadToFile_VB下载文件!

    这些天,写一个小程序,要将某空间服务器上的内容下载到本机使用,开始想用winsock控件,但是因为本人天赋有限,搞不定,所幸在网上发现了这样一个API函数,这个函数可是令人惊叹的好用啊!  比起win ...

  8. Qt 解析 DXF 文件

    Qt 解析 DXF 文件 自己编写,亲测可用 使用示例 #include "dxfhelper.h" int main() {DxfHelper dxfHelper;if(dxfH ...

  9. qt 修改.exe文件图标_如何在没有错误的情况下更改压缩的.EXE文件上的图标

    qt 修改.exe文件图标 We've previously shown you how to modify the icon on an .EXE file, but if you've tried ...

最新文章

  1. 记录一下CUDNN配置
  2. EditText / This text field does not specify an inputType or a hint
  3. 边缘计算用java_物联网技术和边缘计算
  4. 2020 8月 每日花语
  5. zabbix的安装(一)监控os资源:内存,cpu,io,负载,带宽
  6. 机器学习kaggle竞赛实战-泰坦尼克号
  7. elasticsearch删除索引_一文带您了解 Elasticsearch 中,如何进行索引管理(图文教程)
  8. SAS Viya应用简介
  9. 最新公布,“中国开发者大调查”第四批中奖名单来啦
  10. CCF NOI1140 高精度乘法
  11. mysql新建数据库并执行sql文件
  12. ffmpeg 音乐循环_背景音乐自动循环播放
  13. 多个pdf怎么合并成一个pdf?
  14. 2022年餐具行业市场分析
  15. 软件测试找游戏bug,豪之诺游戏测试常见Bug整理
  16. 今日恐慌与贪婪指数为21 恐慌程度有所缓解
  17. 孤尽训练营打卡日记day28--第四周总结
  18. #if endif 的意思
  19. 【分享视频资源】React JS教程
  20. Oracle 几种更新(Update语句)查询的方法

热门文章

  1. 阿里云云效平台配置持续集成--java篇
  2. 【红队】ATTCK - Active Scanning(主动扫描)
  3. javax.el.PropertyNotFoundException: 'newsLine' is an unknown bean property...
  4. [UVM]UVM TLM1.0 Interface归纳总结 --- 图解UVM TLM1.0 Interface
  5. IntelliJ IDEA中项目的包和目录结构显示设置
  6. [置顶]我的2011体会--不是每个程序员都是适合创业,即使你工作了十年
  7. 高效使用Mac标签功能
  8. Single Image Haze Removal Using Dark Channel Prior 基于暗原色先验的单一图像去雾方法【翻译】
  9. 李沐-斯坦福《实用机器学习》-02章
  10. php 实现店铺装修5