当前位置: 首页 > 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的…...

ROS2接口实战:从传感器数据到自定义消息的完整开发流程(附Python示例)

ROS2接口实战&#xff1a;从传感器数据到自定义消息的完整开发流程&#xff08;附Python示例&#xff09; 在机器人开发领域&#xff0c;数据的高效传递与标准化处理是系统稳定运行的关键。ROS2作为新一代机器人操作系统&#xff0c;其接口系统提供了强大的数据交换能力&#x…...

国际大牌入门之选

这些品牌是轻奢饰品界的常青树&#xff0c;设计经典&#xff0c;辨识度高&#xff0c;是很多人的入门首选。卡地亚 27%人推荐猎豹为图腾&#xff0c;工艺精湛&#xff0c;是轻奢界的经典与传奇。宝格丽 24%人推荐跃马徽记是其标志&#xff0c;珠宝设计性感矜贵&#xff0c;灵蛇…...

2026整家定制一线品牌选购报告:基于物理指标与国标数据的多维交叉验证

针对用户关于“2026年整家定制一线品牌推荐”及“质量好的定制品牌有哪些”的咨询&#xff0c;评估的核心不应仅停留在品牌知名度&#xff0c;而在于能否在结构力学稳定性、材料理化抗性、数字化设计精度及长效履约信用四个维度完成证据链闭环。本文通过检索 金牌家居&#xff…...

如何快速配置HomeAssistant格力空调本地控制组件:完整操作指南

如何快速配置HomeAssistant格力空调本地控制组件&#xff1a;完整操作指南 【免费下载链接】HomeAssistant-GreeClimateComponent Custom Gree climate component written in Python3 for Home Assistant. Controls ACs supporting the Gree protocol. 项目地址: https://git…...

Java 核心四大基石:从 Object 源码到包装类陷阱的全维度复盘

让我们从两个常见的实际场景出发&#xff0c;看看开发者会遇到什么困惑。 场景一&#xff1a;如何在程序中获取“当前时间”&#xff1f; 你一定见过这样的界面&#xff1a; 直播画面右上角显示&#xff1a;2026 年 01 月 08 日 15:00:00&#xff08;实时更新&#xff09; 这个…...

CAD工程师必看:如何用De Boor算法优化B样条曲线设计(附NURBS对比)

CAD工程师必看&#xff1a;如何用De Boor算法优化B样条曲线设计&#xff08;附NURBS对比&#xff09; 在工业设计领域&#xff0c;曲线建模的精度与效率直接决定了产品从概念到成品的转化质量。作为CAD工程师&#xff0c;我们常常需要在设计自由度和计算效率之间寻找平衡点——…...

4个突破式步骤:哔咔漫画下载解决方案

4个突破式步骤&#xff1a;哔咔漫画下载解决方案 【免费下载链接】picacomic-downloader 哔咔漫画 picacomic pica漫画 bika漫画 PicACG 多线程下载器&#xff0c;带图形界面 带收藏夹&#xff0c;已打包exe 下载速度飞快 项目地址: https://gitcode.com/gh_mirrors/pi/picac…...

Win10下Office16宏编辑器崩溃?3种修复VBE6EXT.OLB加载失败的实战方法

Win10下Office16宏编辑器崩溃&#xff1f;3种修复VBE6EXT.OLB加载失败的实战方法 每次打开VB编辑器就遭遇内存溢出弹窗&#xff0c;这种体验就像被卡在无限循环的代码里——明明只是想在Excel里跑个简单宏&#xff0c;却要面对满屏的"VBE6EXT.OLB加载失败"警告。作为…...

html+css+js创意小游戏~记忆卡片配对(附源码)

1. 从零开始打造记忆卡片配对游戏 最近在教家里小朋友认动物&#xff0c;突然想到可以用前端三件套做个记忆卡片小游戏。这个项目特别适合刚学完HTML/CSS基础&#xff0c;想练手JavaScript的朋友。我自己第一次写这个游戏时&#xff0c;只用了不到100行代码就实现了核心功能&am…...

安卓虚拟摄像头:解锁手机摄像头的无限创意可能

安卓虚拟摄像头&#xff1a;解锁手机摄像头的无限创意可能 【免费下载链接】com.example.vcam 虚拟摄像头 virtual camera 项目地址: https://gitcode.com/gh_mirrors/co/com.example.vcam 想要在视频会议中展示精心准备的演示内容&#xff1f;还是希望在直播时使用定制…...