【QT实现下载功能】通过request请求下载并保存到本地

想要做一个带有向http请求并获得内容功能的软件,通过寻找网上的示例,了解了想要实现这个功能,主要有几个部分要点:
1.联网(要勾选添加QNetwork库)
2.向http请求内容(发request)
3.获得http返回的内容(定义reply信号,若服务器返回消息,就执行我们自己写的槽函数里的动作,比如下载东西)
差不多就以上三个点,保存到本地的话可以直接保存在QDir::currentPath()当前目录下,也可以定义一个路径并在这个路径下mkdir创建文件夹。(记得添加QDir库)

void PostGet31::createDir()
{
    QDir dir(QDir::currentPath());
    QString new = "saveDir";
    dir.mkdir(new);
}

一、联网

勾选Qt Network
勾选Qt Network modules,并添加相关库

#include <QtNetwork>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>

二、向http请求内容

然后请求链接内容,先付出才有收获,所以要先请求。

	//这两个信号我定义在private里了
    QNetworkReply* reply;
    QNetworkAccessManager* manager;
    
    void PostGet31::startRequest() 
{
    QUrl url = remoteUrl.trimmed();
    manager = new QNetworkAccessManager(this);
    QString fullFileName = localsavedir + url.fileName();
    if (QFile::exists(fullFileName))
    {
        QFile::remove(fullFileName);
    }
    downFile = new QFile(fullFileName);
    if (!downFile->open(QIODevice::WriteOnly))
    {
        return;
    }
    ui.downloadbtn->setEnabled(false);
    //用get发送请求
    reply = manager->get(QNetworkRequest(url));
    //调用QNetworkReply类里的方法连接槽,触发条件是reply有收到消息
    //注意,reply没有finished是接收不到消息的
    connect(reply, &QNetworkReply::finished, this, &PostGet31::networkReplyFinished);
    connect(reply, &QNetworkReply::readyRead, this, &PostGet31::networkReplyReadyRead);
}

三、获得http返回的内容

如果reply->finished就可以准备reply->read读了,这里用的是readAll读全部内容。

void PostGet31::networkReplyFinished()
{
    if (reply->error()) {
        qDebug() << "debug info:" << reply->errorString();
        reply->deleteLater();
        return;
    }
    int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    qDebug() << "statusCode:" << statusCode;
    qDebug() << reply->readAll();
    QFileInfo fileInfo;
    fileInfo.setFile(downFile->fileName());
    downFile->close();
    delete downFile;
    reply->deleteLater();
    reply = nullptr;
}
void PostGet31::networkReplyReadyRead()
{
    downFile->write(reply->readAll());
}

四、其他

用到的其他头文件有这些,后面那几个是为了显示当前时间和下载后会弹出信息框提示已经下载完成或下载失败的,不加也行。

#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QTextStream>
#include <QDateTime>
#include <QMessageBox>

正文完

一开是用的是www.baidu.com来测试请求,但是一直跑不通,状态码是多少忘了,reply显示什么unknown protocol,结果原来是没加http://
url报错
然后就是另外一个问题,当时还是对get post懵懵懂懂,一直下载不了公网上请求的压缩包/软件,后来一步步调试发现状态码还是0,是因为还没有reply完就开始请求下载软件,这样当然是不可以的。

   manager = new QNetworkAccessManager(this);
   reply = manager->get(QNetworkRequest(url));
    connect(reply, &QNetworkReply::finished, this, &PostGet31::on_finished);
    connect(reply, &QNetworkReply::readyRead, this, &PostGet31::readyread);

参考文档

Qt发起http请求,get和post方式,并接收响应数据
Qt 基于http的网络文件下载
一个QT QNetworkAccessManager访问https网址reply错误的问题
URL报错:unknown protocol

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

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

相关文章

蓝桥杯刷题|04普及-真题

[蓝桥杯 2018 省 B] 螺旋折线 题目描述 如图所示的螺旋折线经过平面上所有整点恰好一次。 对于整点 (X,Y)&#xff0c;我们定义它到原点的距离 dis(X,Y) 是从原点到(X,Y) 的螺旋折线段的长度。 例如 dis(0,1)3&#xff0c;dis(−2,−1)9。 给出整点坐标 (X,Y)&#xff0c;你…

CentOS 7.9 常用环境配置

文章目录 环境准备安装docker安装Java安装maven安装git安装MYSQL安装Redis安装RabbitMq安装minio 环境准备 操作系统版本为centos 7.9&#xff0c;内核版本需要在3.10以上 sudo uname -rsudo cat /etc/redhat-release1.确认环境好后&#xff0c;安装工具包并设置仓库 sudo yum…

Android14音频进阶:AudioFlinger究竟如何混音?(六十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

最新ChatGPT/GPT4科研应用与AI绘图及论文高效写作教程

原文链接&#xff1a;最新ChatGPT/GPT4科研应用与AI绘图及论文高效写作教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247598050&idx5&sn70fd3f5946d581ad9c1363295b130ef5&chksmfa823e05cdf5b713baf9cf1381bfb2455ad675a0b21e194bef8b76f35d6aa77…

轻巧的elasticsearch可视化工具

一、概述 常见的ES可视化工具有&#xff1a; kibanaelasticsearch-headElasticHDDejavucerebroelasticview 一、安装elasticview 在众多ES可视化龚居中&#xff0c;elasticview是一款比较轻量简洁&#xff0c;兼容性较好&#xff0c;可以兼容多个ES版本&#xff0c;不但可以进…

PySpark案例实战

一、前言介绍 二、基础准备 # 导包 from pyspark import SparkConf,SparkContext #创建SparkConf类对象 confSparkConf().setMaster("local[*]").setAppName("test_spark_app") #基于SparkXConf类对象创建SparkContext对象 scSparkContext(confconf) #打印…

PCL 极大似然估计法拟合平面

目录 一、算法原理1、极大似然估计2、拟合过程3、参考文献二、代码实现三、结果展示一、算法原理 1、极大似然估计 在以最小二乘法为基础的估计算法中, 所有的参数都是确定值;而实际上,测量数据与未知参数都具有一定的随机性。这就导致了最小二乘法估计质量的缺陷以及对白噪…

整型数组按个位值排序 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 给定一个非空数组(列表)&#xff0c;其元素数据类型为整型&#xff0c;请按照数组元素十进制最低位从小到大进行排序&#xff0c;十进制最低位相同的元素&#xf…

机器学习——编程实现从零构造训练集的决策树

自己搭建一棵决策树【长文预警】 忙了一个周末就写到了“构建决策树”这一步&#xff0c;还没有考虑划分测试集、验证集、“缺失值、连续值”&#xff0c;预剪枝、后剪枝的部分&#xff0c;后面再补吧&#xff08;挖坑&#xff09; 第二节内容&#xff1a;验证集划分\k折交叉…

线性代数基础概念和在AI中的应用

基本概念 线性代数是数学的一个分支&#xff0c;专注于向量、向量空间&#xff08;也称为线性空间&#xff09;、线性变换和矩阵的研究。这些概念在数据科学、人工智能、工程学和物理学等多个领域都有广泛应用。以下是这些基本概念的详细解释和它们在数据处理和AI中的应用。 …

Jackson 2.x 系列【2】生成器 JsonGenerator

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 前言2. 案例演示2.1 创建 JsonFactory2.2 创建 JsonGenerator2.3 写入操作2.4 查…

期权波动率是什么?怎么计算?

期权波动率 历史波动率&#xff1a;基于历史行情计算出来的历史波动率 我们现在站在现实时点B回顾过去&#xff0c;从A到B这段时间的历史行情我们是知道的&#xff0c;但是基于过去一段时间&#xff0c;标的价格的历史数据计算出来的波动率&#xff0c;就是历史波动率&#x…

分布式搜索引擎elasticsearch专栏二

上一篇的传送门&#xff1a; 分布式搜索引擎elasticsearch专栏一-CSDN博客 这一篇博文主要讲解elasticsearch的数据搜索功能。下面会分别使用DSL和RestClient实现搜索。 1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsea…

Mac nvm install failed python: not found

报错 $>./configure --prefix/Users/xxx/.nvm/versions/node/v12.22.12 < ./configure: line 3: exec: python: not found nvm: install v12.22.12 failed!解决方法 到 App 文件夹&#xff0c;并且打开 cd /System/Applications/Utilities/ open .记得改完 Rosetta 之…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之三 简单卡通漫画风格效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之三 简单卡通漫画风格效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之三 简单卡通漫画风格效果 一、简单介绍 二、简单卡通漫画风格效果实现原理 A、边缘蒙版的处理说明&#xff1…

FPGA控制AD7606_AD7606解读

目录 一、AD7606解读二、引脚说明三、时序图 一、AD7606解读 AD7606特点&#xff1a; 8通道同步采样模拟通道数为8分辨率&#xff1a;16bit&#xff0c;即最小采样的电压为5V/(2^16) 0,00007V&#xff0c;即数字量的1就代表模拟量的0,00007V&#xff0c;2代表0,00014V有效位数…

鸿蒙开发实战:【系统服务管理部件】

简介 samgr组件是OpenHarmony的核心组件&#xff0c;提供OpenHarmony系统服务启动、注册、查询等功能。 系统架构 图 1 系统服务管理系统架构图 目录 /foundation/systemabilitymgr ├── samgr │ ├── bundle.json # 部件描述及编译文件 │ ├── frameworks …

linux之centos7vmware虚拟机的安装

目录 一、下载合适的vmware和操作系统镜像安装文件 来自引用文章的软件下载本片文章使用的软件下载 二、根据教程进行安装 三、网络配置解说 四、配置网络 编辑虚拟机网络 对VMWARE虚拟机网络进行配置 设置虚拟机网络为NAT模式 设置自定义网络为 VMnet8(NAT模式) 编辑li…

[ C++ ] STL---list的使用指南

目录 list简介 list的常用接口 构造函数 赋值运算符重载 迭代器 容量相关接口 元素访问接口 修改相关接口 头插push_front() 头删pop_front() 尾插push_back() 尾删pop_back() insert() erase() list的迭代器失效 list简介 1. list是可以以O(1)的时间复杂度在任意…

机器人现有力控技术检索

文章目录 力控技术1 基本柔顺力控1.1 直接力控1.2 间接力控1.2.1 被动和主动柔顺控制1.2.2 混合力位控制1.2.3 阻抗&导纳力控1.2.3.1 原理1.2.3.2 区别和联系1.2.3.3 工程应用 1.2.4 阻抗力控1.2.5 导纳力控 2 先进力控2.1 自适应力控2.2 鲁棒力控2.3 学习力控 3 智能力控3…