当前位置: 首页 > news >正文

qt 5.15.2 网络文件下载功能

qt 5.15.2 网络文件下载功能

#include <QCoreApplication>#include <iostream>
#include <QFile>
#include <QTextStream>
//
#include <QtCore>
#include <QtNetwork>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QUrl>
#include <QDir>
//
#include <QStringList>
#include "downloadmanager.h"
//
int printf(QString line)
{std::cout<<line.toStdString()<<std::endl;
}
int printf(int line)
{std::cout<<line<<std::endl;
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);std::cout<<"Hello World! hsg77"<<std::endl;QString toDirPath="C:\\data\\obj\\test";DownloadManager manager;manager.setOutDir(toDirPath);//manager.append(arguments);//打开csv文件QFile file("E:\\QtProject\\objDownloadTest\\GridIdx_OBJ.csv");std::cout<<file.fileName().toStdString()<<std::endl;if(file.exists()){if(file.open(QIODevice::ReadOnly)){QTextStream in(&file);//std::cout<<"file state="<<in.atEnd()<<std::endl;while(!in.atEnd()){QString line=in.readLine();QStringList fds=line.split("	");//std::cout<<line.toStdString()<<std::endl;//printf(fds.length());//处理每一行的数据QString fileUrl=fds.at(13);printf("readydown="+fileUrl);                if(fileUrl!="FILE_URL"){//下载文件  fileUrlQUrl url(fileUrl);manager.append(url);}}//}}//file.close();std::cout<<"csv file closed"<<std::endl;//开始下载开始QObject::connect(&manager,&DownloadManager::finished,&a,&QCoreApplication::quit);return a.exec();
}

定义:下载管理类
DownloadManager.h

#ifndef DOWNLOADMANAGER_H
#define DOWNLOADMANAGER_H#include <QtNetwork>
#include <QtCore>#include "textprogressbar.h"class DownloadManager: public QObject
{Q_OBJECT
public:explicit DownloadManager(QObject *parent = nullptr);void append(const QUrl &url);void append(const QStringList &urls);static QString saveFileName(const QUrl &url,const QString outDir);void setOutDir(const QString outDir);signals:void finished();private slots:void startNextDownload();void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);void downloadFinished();void downloadReadyRead();private:bool isHttpRedirect() const;void reportRedirect();QNetworkAccessManager manager;QQueue<QUrl> downloadQueue;QNetworkReply *currentDownload = nullptr;QFile output;QElapsedTimer downloadTimer;TextProgressBar progressBar;int downloadedCount = 0;int totalCount = 0;QString outDir="";
};#endif // DOWNLOADMANAGER_H

DownloadManager.cpp

#include "downloadmanager.h"#include <QTextStream>#include <cstdio>using namespace std;DownloadManager::DownloadManager(QObject *parent): QObject(parent)
{
}void DownloadManager::append(const QStringList &urls)
{for (const QString &urlAsString : urls)append(QUrl::fromEncoded(urlAsString.toLocal8Bit()));if (downloadQueue.isEmpty())QTimer::singleShot(0, this, &DownloadManager::finished);
}void DownloadManager::append(const QUrl &url)
{if (downloadQueue.isEmpty())QTimer::singleShot(0, this, &DownloadManager::startNextDownload);downloadQueue.enqueue(url);++totalCount;
}QString DownloadManager::saveFileName(const QUrl &url,const QString outDir)
{QString path = url.path();QString basename = QFileInfo(path).fileName();QString newFilePath=outDir+"\\"+basename;return newFilePath;//if (basename.isEmpty())basename = "download";if (QFile::exists(basename)) {// already exists, don't overwriteint i = 0;basename += '.';while (QFile::exists(basename + QString::number(i)))++i;basename += QString::number(i);}return basename;
}void DownloadManager::setOutDir(const QString outDir)
{this->outDir=outDir;
}void DownloadManager::startNextDownload()
{if (downloadQueue.isEmpty()) {printf("%d/%d files downloaded successfully\n", downloadedCount, totalCount);emit finished();return;}QUrl url = downloadQueue.dequeue();QString filename = saveFileName(url,this->outDir);output.setFileName(filename);if (!output.open(QIODevice::WriteOnly)) {fprintf(stderr, "Problem opening save file '%s' for download '%s': %s\n",qPrintable(filename), url.toEncoded().constData(),qPrintable(output.errorString()));startNextDownload();return;                 // skip this download}QNetworkRequest request(url);currentDownload = manager.get(request);connect(currentDownload, &QNetworkReply::downloadProgress,this, &DownloadManager::downloadProgress);connect(currentDownload, &QNetworkReply::finished,this, &DownloadManager::downloadFinished);connect(currentDownload, &QNetworkReply::readyRead,this, &DownloadManager::downloadReadyRead);// prepare the outputprintf("Downloading %s...\n", url.toEncoded().constData());downloadTimer.start();
}void DownloadManager::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{progressBar.setStatus(bytesReceived, bytesTotal);// calculate the download speeddouble speed = bytesReceived * 1000.0 / downloadTimer.elapsed();QString unit;if (speed < 1024) {unit = "bytes/sec";} else if (speed < 1024*1024) {speed /= 1024;unit = "kB/s";} else {speed /= 1024*1024;unit = "MB/s";}progressBar.setMessage(QString::fromLatin1("%1 %2").arg(speed, 3, 'f', 1).arg(unit));progressBar.update();
}void DownloadManager::downloadFinished()
{progressBar.clear();output.close();if (currentDownload->error()) {// download failedfprintf(stderr, "Failed: %s\n", qPrintable(currentDownload->errorString()));output.remove();} else {// let's check if it was actually a redirectif (isHttpRedirect()) {reportRedirect();output.remove();} else {printf("Succeeded.\n");++downloadedCount;}}currentDownload->deleteLater();startNextDownload();
}void DownloadManager::downloadReadyRead()
{output.write(currentDownload->readAll());
}bool DownloadManager::isHttpRedirect() const
{int statusCode = currentDownload->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();return statusCode == 301 || statusCode == 302 || statusCode == 303|| statusCode == 305 || statusCode == 307 || statusCode == 308;
}void DownloadManager::reportRedirect()
{int statusCode = currentDownload->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();QUrl requestUrl = currentDownload->request().url();QTextStream(stderr) << "Request: " << requestUrl.toDisplayString()<< " was redirected with code: " << statusCode<< '\n';QVariant target = currentDownload->attribute(QNetworkRequest::RedirectionTargetAttribute);if (!target.isValid())return;QUrl redirectUrl = target.toUrl();if (redirectUrl.isRelative())redirectUrl = requestUrl.resolved(redirectUrl);QTextStream(stderr) << "Redirected to: " << redirectUrl.toDisplayString()<< '\n';
}

定义进度条类
TextProgressBar.h

#ifndef TEXTPROGRESSBAR_H
#define TEXTPROGRESSBAR_H#include <QString>class TextProgressBar
{
public:void clear();void update();void setMessage(const QString &message);void setStatus(qint64 value, qint64 maximum);private:QString message;qint64 value = 0;qint64 maximum = -1;int iteration = 0;
};#endif // TEXTPROGRESSBAR_H

TextProgressBar.cpp

#include "textprogressbar.h"#include <QByteArray>#include <cstdio>using namespace std;void TextProgressBar::clear()
{printf("\n");fflush(stdout);value = 0;maximum = -1;iteration = 0;
}void TextProgressBar::update()
{++iteration;if (maximum > 0) {// we know the maximum// draw a progress barint percent = value * 100 / maximum;int hashes = percent / 2;QByteArray progressbar(hashes, '#');if (percent % 2)progressbar += '>';printf("\r[%-50s] %3d%% %s     ",progressbar.constData(),percent,qPrintable(message));} else {// we don't know the maximum, so we can't draw a progress barint center = (iteration % 48) + 1; // 50 spaces, minus 2QByteArray before(qMax(center - 2, 0), ' ');QByteArray after(qMin(center + 2, 50), ' ');printf("\r[%s###%s]      %s      ",before.constData(), after.constData(), qPrintable(message));}
}void TextProgressBar::setMessage(const QString &m)
{message = m;
}void TextProgressBar::setStatus(qint64 val, qint64 max)
{value = val;maximum = max;
}

–the—end—
本blog地址:http://blog.csdn.net/hsg77

相关文章:

qt 5.15.2 网络文件下载功能

qt 5.15.2 网络文件下载功能 #include <QCoreApplication>#include <iostream> #include <QFile> #include <QTextStream> // #include <QtCore> #include <QtNetwork> #include <QNetworkAccessManager> #include <QNetworkRep…...

Wifi adb 操作步骤

1.连接usb 到主机 手机开起热点&#xff0c;电脑和车机连接手机&#xff0c;或者电脑开热点&#xff0c;车机连接电脑&#xff0c;车机和电脑连接同一个网络 因为需要先使用usb&#xff0c;后面切换到wifi usb 2.查看车机ip地址&#xff0c;和电脑ip地址 电脑win键r 输入cmd…...

湿货 - 231206 - 关于如何构造输入输出数据并读写至文件中

TAG - 造数据、读写文件 造数据、读写文件 造数据、读写文件//*.in // #include<bits/stdc.h> using namespace std;/* *********** *********** 全局 ********** *********** */ string Pre_File_Name; ofstream IN_cout; int idx;void Modify_ABS_Path( string& …...

EasyMicrobiome-易扩增子、易宏基因组等分析流程依赖常用软件、脚本文件和数据库注释文件

啥也不说了&#xff0c;这个好用&#xff0c;给大家推荐&#xff1a;YongxinLiu/EasyMicrobiome (github.com) 大家先看看引用文献吧&#xff0c;很有用&#xff1a;https://doi.org/10.1002/imt2.83 还有这个&#xff0c;后面马上介绍&#xff1a;YongxinLiu/EasyAmplicon: E…...

【Python百宝箱】漫游Python数据可视化宇宙:pyspark、dash、streamlit、matplotlib、seaborn全景式导览

Python数据可视化大比拼&#xff1a;从大数据处理到交互式Web应用 前言 在当今数字时代&#xff0c;数据可视化是解释和传达信息的不可或缺的工具之一。本文将深入探讨Python中流行的数据可视化库&#xff0c;从大数据处理到交互式Web应用&#xff0c;为读者提供全面的了解和…...

企业数字档案馆室建设指南

数字化时代&#xff0c;企业数字化转型已经成为当下各行业发展的必然趋势。企业数字化转型不仅仅是IT系统的升级&#xff0c;也包括企业内部各种文件、档案、合同等信息的数字化管理。因此&#xff0c;建设数字档案馆室也变得尤为重要。本篇文章将为您介绍企业数字档案馆室建设…...

JavaScript中处理时间差

ES6版本 function countdown(endTime, includeSeconds true) {// 获取当前时间let now new Date();// 将传入的结束时间字符串转换为日期对象let endDateTime new Date(endTime);// 检查传入的时间字符串是否只包含日期&#xff08;不包含时分秒&#xff09;if (endTime.tr…...

Multidimensional Scaling(MDS多维缩放)算法及其应用

在这篇博客中&#xff0c;我将与大家分享在流形分析领域的一个非常重要的方法&#xff0c;即多维缩放MDS。整体来说&#xff0c;该方法提供了一种将内蕴距离映射到显性欧氏空间的计算&#xff0c;为非刚性形状分析提供了一种解决方案。当初就是因为读了Bronstein的相关工作【1】…...

单片机_RTOS_架构

一. RTOS的概念 // 经典单片机程序 void main() {while (1){喂一口饭();回一个信息();} } ------------------------------------------------------ // RTOS程序 喂饭() {while (1){喂一口饭();} }回信息() {while (1){回一个信息();} }void main() {create_task(喂饭);cr…...

Golang rsa 验证

一下代码用于rsa 签名的验签&#xff0c; 签名可以用其他语言产生。也可以用golang生成。 package mainimport ("crypto""crypto/rsa""crypto/sha256""crypto/x509""encoding/pem""errors""fmt" )fun…...

网络安全威胁——跨站脚本攻击

跨站脚本攻击 1. 定义2. 跨站脚本攻击如何工作3. 跨站脚本攻击类型4. 如何防止跨站脚本攻击 1. 定义 跨站脚本攻击&#xff08;Cross-site Scripting&#xff0c;通常称为XSS&#xff09;&#xff0c;是一种典型的Web程序漏洞利用攻击&#xff0c;在线论坛、博客、留言板等共享…...

Java利用UDP实现简单的双人聊天

一、创建新项目 首先创建一个新的项目&#xff0c;并命名。 二、实现代码 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.IOException; import java.lang.String; public class liaotian extends JFrame{ pri…...

HBase整合Phoenix

文章目录 一、简介1、Phoenix定义2、Phoenix架构 二、安装Phoenix1、安装 三、Phoenix操作1、Phoenix 数据映射2、Phoenix Shell操作3、Phoenix JDBC操作3.1 胖客户端3.2 瘦客户端 四、Phoenix二级索引1、为什么需要二级索引2、全局索引&#xff08;global index&#xff09;3、…...

C# 委托/事件/lambda

概念 委托 定义委托编译器会自动生成一个类派生自System.MulticastDelegate 这个类包含4个方法&#xff1a;一个构造器、Invoke、BeginInvoke、EndInvoke。 调用委托的时候实际上执行的是 Invoke方法。 MulticastDelegate类有三个重要字段&#xff1a; _target&#xff…...

13款趣味性不错(炫酷)的前端动画特效及源码(预览获取)分享(附源码)

文字激光打印特效 基于canvas实现的动画特效&#xff0c;你既可以设置初始的打印文字也可以在下方输入文字可实现激光字体打印&#xff0c;精简易用。 预览获取 核心代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…...

C# 友元程序集

1.友元程序集 使用友元程序集可以将internal成员提供给其他的友元程序集访问。 程序集FriendTest1.dll [assembly:InternalsVisibleTo("FriendTest2")] namespace FriendTest1 {internal class Friend{string name;public string Name > name;public Friend(str…...

CRM系统的数据分析和报表功能对企业重要吗?

竞争日益激烈&#xff0c;企业需要更加高效地管理客户关系&#xff0c;以获取更多的商机。为此&#xff0c;许多企业选择使用CRM系统。在CRM中&#xff0c;数据分析功能扮演着重要的角色。下面就来详细说说&#xff0c;CRM系统数据分析与报表功能对企业来说重要吗&#xff1f; …...

【单体架构事务失效解决方式之___代理对象加锁】

单体架构__用户限买 一个id一单的多线程事务失效问题解决 背景介绍&#xff1a;有一种情况&#xff0c;我们在使用Synchronized的时候出现失效情况。 经过排查&#xff0c;是因为使用了this.当前对象&#xff0c;他现在使用的是目标对象加锁失效&#xff0c;使用代理对象加锁就…...

面试被问到 HTTP和HTTPS的区别有哪些?你该如何回答~

HTTP和HTTPS的区别有哪些&#xff0c;主要从以下几个方面来说&#xff1a; 1.安全性 HTTP和HTTPS是两种不同的协议&#xff0c;它们之间最主要的区别在于安全性。HTTP协议以明文方式发送内容&#xff0c;不提供任何方式的数据加密&#xff0c;容易被攻击者截取信息。 HTTPS则在…...

点评项目——短信登陆模块

2023.12.6 短信登陆如果基于session来实现&#xff0c;会存在session共享问题&#xff1a;多台Tomcat不能共享session存储空间&#xff0c;这会导致当请求切换到不同服务器时出现数据丢失的问题。 早期的解决办法是让session提供一个数据拷贝的功能&#xff0c;即让各个Tomcat的…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...