QT通过url下载http地址下的文件(文件夹)

news2025/1/16 3:32:22

前言

之前只写过通过http协议通信,没有写过下载http地址中的文件或者文件夹,了解一下在QT下如何下载。

其实很简单,同使用协议通信相同的是,创建QNetworkAccessManager和QNetworkRequest,设置QNetworkRequest的url,通过get请求接收QNetworkReply中数据,利用downloadProgress信号接收每次下载下来的内容,直到下载完成。

代码如下:

 .pro

主要是加上network模块

#-------------------------------------------------
#
# Project created by QtCreator 2023-10-26T18:29:32
#
#-------------------------------------------------

QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = load_http_file
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        widget.cpp \

HEADERS += \
        widget.h \

FORMS += \
        widget.ui

界面:

 widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QFile>
#include <QUrl>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QEventLoop>
#include <QTimer>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    bool downloadFile(QString url);
private slots:
    void on_load_zip_clicked();

private:
    Ui::Widget *ui;

private:
    bool flag_download = false;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include <QDir>
#include <QThread>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{

}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_load_zip_clicked()
{
    downloadFile(ui->lineEdit_url->text());
}

bool Widget::downloadFile(QString url)
{
    if(flag_download)
    {
        qDebug()<<"有正在下载中的文件,已停止当前下载。";
        return false;
    }
    int timeout = 1000 * 60; //* 3;
    QString path = "3D";
    QDir dir(path);
    if(!dir.exists())
    {
        if(!dir.mkdir(dir.absolutePath()))
        {
            qDebug()<<"创建3D文件夹失败!";
            return false;
        }
    }
    path = path + "/" + url.section('/',-1,-1);
    qDebug()<<"url:"<<url<<" path:"<<path;
    QFile file(path);
    if (!file.open(QIODevice::WriteOnly))
    {
        qDebug()<<"打开待下载文件失败!";
        return false;
    }

    flag_download = true;

    QNetworkAccessManager networkManager;
    QNetworkRequest request;
    request.setUrl(QUrl(url));
    QNetworkReply *reply = networkManager.get(request);

    QTimer timer;
    QEventLoop eventLoop;
    connect(reply, &QNetworkReply::downloadProgress, [=, &file, &timer](qint64 bytesReceived,qint64 bytesTotal){
        qDebug()<<"当前下载的文件大小:"<<bytesReceived<<"   总文件大小:"<<bytesTotal;
        if (timer.isActive())
            timer.start(timeout);
        file.write(reply->readAll());
    });
    connect(reply, &QNetworkReply::finished, &timer, &QTimer::stop);
    connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);

    connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
    timer.start(timeout);

    eventLoop.exec();//QEventLoop::ExcludeUserInputEvents

    flag_download = false;

    if (reply->error() != QNetworkReply::NoError)
    {
        qDebug()<<"请求失败!失败原因:"<<reply->error();
        file.close();
        delete reply;
        return false;
    }
    if(timer.isActive())
    {
        qDebug()<<"请求超时!";
        timer.stop();
        file.close();
        delete reply;
        return false;
    }
    qDebug()<<"下载3D文件成功!";
    file.close();
    delete reply;
    return true;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

游戏中的随机——“动态平衡概率”算法(二)

前言 本文是对上一篇文章的补充和总结。 在上一篇文章中&#xff0c;笔者提出了一套基本可用的“动态平衡概率”算法&#xff0c;本文将继续对该算法进行更加深入的探讨&#xff0c;解决上篇文章中的部分遗留问题&#xff0c;以及记录一下对“游戏中的概率”的一些思考&#…

【优选算法系列】第一节.二分查找简介加习题(704. 二分查找和34. 在排序数组中查找元素的第一个和最后一个位置)

文章目录 前言二分查找简介一、二分查找 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写二、在排序数组中查找元素的第一个和最后一个位置 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编…

CSS选择器、CSS属性相关

CSS选择器 CSS属性选择器 通过标签的属性来查找标签&#xff0c;标签都有属性 <div class"c1" id"d1"></div>id值和class值是每个标签都自带的属性&#xff0c;还有另外一种&#xff1a;自定义属性 <div class"c1" id"d1&…

基于元学习神经网络的类人系统泛化

Nature 上介绍了一个关于AI在语言泛化方面的突破性研究。科学家们创建了一个具有人类般泛化能力的AI神经网络&#xff0c;它可以像人类一样将新学到的词汇融入现有词汇&#xff0c;并在新环境中使用它们。与ChatGPT 相比&#xff0c;该神经网络在系统性泛化测试中表现得更好。 …

pycharm切换不同的conda环境

进入file–>setting 这里会展示所有的conda环境&#xff0c;选择其中一个 点击刷新&#xff0c;展示你所有的库

RIS辅助MIMO广播信道容量

RIS辅助MIMO广播信道容量 摘要RIS辅助的BC容量矩阵形式的泰勒展开学习舒尔补 RIS-Aided Multiple-Input Multiple-Output Broadcast Channel Capacity论文阅读记录 基于泰勒展开求解了上行容量和最差用户的可达速率&#xff0c;学习其中的展开方法。 摘要 Scalable algorithm…

84.在排序数组中查找元素的第一个和最后一个位置(力扣)

目录 问题描述 代码解决以及思想 知识点 问题描述 代码解决以及思想 class Solution { public:vector<int> searchRange(vector<int>& nums, int target) {int left 0; // 定义左边界int right nums.size() - 1; // 定义右…

微服务之负载均衡使用场景

在如见常见微服务系统中&#xff0c;负载均衡组件是一种将流量分配到多个服务的技术&#xff0c;目的是提高系统的性能和可用性。负载均衡有两种常见的模式&#xff1a;服务端模式和客户端模式。服务端模式使用独立的应用程序&#xff08;如 Nginx&#xff09;来转发请求&#…

HTML5+CSS3+JS小实例:交互式图片鼠标悬停景深对焦效果

实例:交互式图片鼠标悬停景深对焦效果 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport"…

木马免杀(篇三)静态免杀方法

紧接上一篇&#xff0c;是通过 cs 生成 shellcode 并直接用python 调用动态链接库执行 shellcode 。 生成后的exe文件未进行任何处理。 现在学习一些可以绕过静态免杀的方法。即将文件上传到目标不会被杀软查杀&#xff0c;但这只是静态方面。 动态免杀方面还涉及到很多东西&…

七、W5100S/W5500+RP2040树莓派Pico<UDP 组播>

文章目录 1. 前言2. 相关简介2.1 简述2.2 优点2.3 应用 3. WIZnet以太网芯片4. UDP 组播回环测试4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 测试现象 5. 注意事项6. 相关链接 1. 前言 UDP组播是一种基于UDP协议的通信方式&#xff0c;它允许一台计算机通过发送单…

怎么解决气膜场馆噪音太大的问题?

近年来&#xff0c;多功能声学综合馆作为一种创新的建筑解决方案&#xff0c;有效地解决了传统气膜馆内部噪音问题。传统气膜馆由于其特殊结构和材料特性&#xff0c;常常受到噪音扩散和反射问题的困扰&#xff0c;影响了人们的听觉体验和活动效果。而多功能声学综合馆凭借声学…

Web - Servlet详解

目录 前言 一 . Servlet简介 1.1 动态资源和静态资源 1.2 Servlet简介 二 . Servlet开发流程 2.1 目标 2.2 开发过程 三 . Servlet注解方式配置 ​编辑 四 . servlet生命周期 4.1 生命周期简介 4.2 生命周期测试 4.3 生命周期总结 五 . servlet继承结构 5.1 ser…

Qt Concurrent框架详解(QFuture、QFutureWatcher)

1.概述 Qt Concurrent是Qt提供的一个并发编程框架&#xff0c;用于简化多线程和并行计算的开发。它提供了一组易于使用的函数和类&#xff0c;可以方便地在多线程环境下处理并发任务。 有以下特点&#xff1a; 简单易用&#xff1a;Qt Concurrent提供了一组高级函数和类&…

开关电源绝缘阻抗的检测标准是什么?如何测试绝缘阻抗性能?

绝缘阻抗测试是开关电源测试的一种重要方法&#xff0c;用来检测电气设备接线中断路和线路接触阻抗。用开关电源测试系统测试绝缘阻抗值保证结果准确性&#xff0c;评估绝缘阻抗性能&#xff0c;判断开关电源质量是否良好&#xff0c;从而保证开关电源的稳定性和可靠性。 怎么测…

论文研究中数据获取与查询

数据分析是写论文中一个非常重要的环节&#xff0c;特别是对于与经济相关专业的学子来讲&#xff0c;在写论文时避免不了需要案例分析&#xff0c;这时候数据分析就在其中显得尤为重要。 但是我们通常怎么获取这些数据呢&#xff1f; 下面给大家推荐几个能用得上的数据查询网站…

2023年10月28日历史上的今天大事件早读

1372年10月28日《水浒传》的作者施耐庵逝世 1818年10月28日俄国作家屠格涅夫诞辰 1886年10月28日法国送给美国的自由女神像揭幕 1894年10月28日现代著名作家叶圣陶出生 1902年10月28日马克思第一次被介绍给国人 1940年10月28日意军开始入侵希腊 1945年10月28日赵树理发表…

腾讯新专利,微信聊天终于可以加密/隐藏了!

随着互联网技术的发展&#xff0c;个人信息被倒卖、聊天记录泄露等情况时有发生&#xff0c;让人们不得不警惕慎言。 为了解决这个问题&#xff0c;腾讯最近获得了一项专利&#xff1a;据了解&#xff0c;该项专利名为“聊天消息的显示方法、发送方法、装置、电子设备及介质”。…

亲手教你WebUI自动化框架从零开始搭建

一、设计思路 PO模式 对象库层&#xff1a;二次封装Selenium的方法。 core&#xff1a;主要封装driver方法&#xff0c;并加入日志、失败截图 页面操作层(逻辑层)&#xff1a;元素对象和元素操作的封装。page&#xff1a;封装页面的元素对象和元素操作 业务层&#xff1a;测试…

零信任安全模型和多因素身份验证:提升网络安全的关键一步

近年来&#xff0c;随着疫情的蔓延和科技的飞速发展&#xff0c;数据和工作的数字化程度前所未有。这虽然为机会创造提供了更多空间&#xff0c;但也为潜在威胁行为者提供了新的入侵途径。因此&#xff0c;数据泄露的防范已经成为每个组织IT基础设施中不可或缺的一部分。 数据泄…