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 到主机 手机开起热点,电脑和车机连接手机,或者电脑开热点,车机连接电脑,车机和电脑连接同一个网络 因为需要先使用usb,后面切换到wifi usb 2.查看车机ip地址,和电脑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-易扩增子、易宏基因组等分析流程依赖常用软件、脚本文件和数据库注释文件
啥也不说了,这个好用,给大家推荐:YongxinLiu/EasyMicrobiome (github.com) 大家先看看引用文献吧,很有用:https://doi.org/10.1002/imt2.83 还有这个,后面马上介绍:YongxinLiu/EasyAmplicon: E…...
【Python百宝箱】漫游Python数据可视化宇宙:pyspark、dash、streamlit、matplotlib、seaborn全景式导览
Python数据可视化大比拼:从大数据处理到交互式Web应用 前言 在当今数字时代,数据可视化是解释和传达信息的不可或缺的工具之一。本文将深入探讨Python中流行的数据可视化库,从大数据处理到交互式Web应用,为读者提供全面的了解和…...
企业数字档案馆室建设指南
数字化时代,企业数字化转型已经成为当下各行业发展的必然趋势。企业数字化转型不仅仅是IT系统的升级,也包括企业内部各种文件、档案、合同等信息的数字化管理。因此,建设数字档案馆室也变得尤为重要。本篇文章将为您介绍企业数字档案馆室建设…...
JavaScript中处理时间差
ES6版本 function countdown(endTime, includeSeconds true) {// 获取当前时间let now new Date();// 将传入的结束时间字符串转换为日期对象let endDateTime new Date(endTime);// 检查传入的时间字符串是否只包含日期(不包含时分秒)if (endTime.tr…...
Multidimensional Scaling(MDS多维缩放)算法及其应用
在这篇博客中,我将与大家分享在流形分析领域的一个非常重要的方法,即多维缩放MDS。整体来说,该方法提供了一种将内蕴距离映射到显性欧氏空间的计算,为非刚性形状分析提供了一种解决方案。当初就是因为读了Bronstein的相关工作【1】…...
单片机_RTOS_架构
一. RTOS的概念 // 经典单片机程序 void main() {while (1){喂一口饭();回一个信息();} } ------------------------------------------------------ // RTOS程序 喂饭() {while (1){喂一口饭();} }回信息() {while (1){回一个信息();} }void main() {create_task(喂饭);cr…...
Golang rsa 验证
一下代码用于rsa 签名的验签, 签名可以用其他语言产生。也可以用golang生成。 package mainimport ("crypto""crypto/rsa""crypto/sha256""crypto/x509""encoding/pem""errors""fmt" )fun…...
网络安全威胁——跨站脚本攻击
跨站脚本攻击 1. 定义2. 跨站脚本攻击如何工作3. 跨站脚本攻击类型4. 如何防止跨站脚本攻击 1. 定义 跨站脚本攻击(Cross-site Scripting,通常称为XSS),是一种典型的Web程序漏洞利用攻击,在线论坛、博客、留言板等共享…...
Java利用UDP实现简单的双人聊天
一、创建新项目 首先创建一个新的项目,并命名。 二、实现代码 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、全局索引(global index)3、…...
C# 委托/事件/lambda
概念 委托 定义委托编译器会自动生成一个类派生自System.MulticastDelegate 这个类包含4个方法:一个构造器、Invoke、BeginInvoke、EndInvoke。 调用委托的时候实际上执行的是 Invoke方法。 MulticastDelegate类有三个重要字段: _targetÿ…...
13款趣味性不错(炫酷)的前端动画特效及源码(预览获取)分享(附源码)
文字激光打印特效 基于canvas实现的动画特效,你既可以设置初始的打印文字也可以在下方输入文字可实现激光字体打印,精简易用。 预览获取 核心代码 <!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系统的数据分析和报表功能对企业重要吗?
竞争日益激烈,企业需要更加高效地管理客户关系,以获取更多的商机。为此,许多企业选择使用CRM系统。在CRM中,数据分析功能扮演着重要的角色。下面就来详细说说,CRM系统数据分析与报表功能对企业来说重要吗? …...
【单体架构事务失效解决方式之___代理对象加锁】
单体架构__用户限买 一个id一单的多线程事务失效问题解决 背景介绍:有一种情况,我们在使用Synchronized的时候出现失效情况。 经过排查,是因为使用了this.当前对象,他现在使用的是目标对象加锁失效,使用代理对象加锁就…...
面试被问到 HTTP和HTTPS的区别有哪些?你该如何回答~
HTTP和HTTPS的区别有哪些,主要从以下几个方面来说: 1.安全性 HTTP和HTTPS是两种不同的协议,它们之间最主要的区别在于安全性。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,容易被攻击者截取信息。 HTTPS则在…...
点评项目——短信登陆模块
2023.12.6 短信登陆如果基于session来实现,会存在session共享问题:多台Tomcat不能共享session存储空间,这会导致当请求切换到不同服务器时出现数据丢失的问题。 早期的解决办法是让session提供一个数据拷贝的功能,即让各个Tomcat的…...
2023亚太地区五岳杯量子计算挑战赛
计算电源网 (CPN)布局优化 1. 介绍 计算能力网络 (CPN)是一种基于业务需求分配和调度计算资源的新型信息基础设施,计算资源通常由终端用户、边缘服务器和云服务器组成。该网络旨在满足各种计算任务的需求。根据计算需求的空间分…...
Python 模块的使用方法
Python 模块是一种组织和封装代码的方式,允许你将相关的功能和变量放在一个单独的文件中,以便在其他程序中重复使用。在Python中,模块是一种可执行的Python脚本,其文件扩展名为 .py。这里,我将详细讲解Python模块的使用…...
【知识】稀疏矩阵是否比密集矩阵更高效?
转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 问题提出 有些地方说,稀疏图比密集图的计算效率更高,真的吗? 原因猜想 这里的效率高,应该是有前提的:当使用稀疏矩阵的存储格式(如CSR)时,计…...
代码随想Day24 | 回溯法模板、77. 组合
理论基础 回溯法和递归不可分割,回溯法是一种穷举的方法,通常需要剪枝来降低复杂度。回溯法有一个选择并退回的过程,可以抽象为树结构,回溯法的模板如下: void backtracking(参数) {if (终止条件) {存放结果;return;}…...
搜索与回溯算法②
求0-9的数字可以组成的所有k 位数。 def backtrack(start, path, k, n, results):"""核心函数。:param start: 下一个添加的数字的起始位置:param path: 当前构建的路径,代表一个组合:param k: 组合中所需的数字个数:param n: 可选数字的最大值:par…...
Centos图形化界面封装OpenStack Ubuntu镜像
目录 背景 环境 搭建kvm环境 安装ubuntu虚机 虚机设置 系统安装 登录虚机 安装cloud-init 安装cloud-utils-growpart 关闭实例 删除细节信息 删除网卡细节 使虚机脱离libvirt纳管 结束与验证 压缩与转移 验证是否能够正常运行 背景 一般的镜像文件在上传OpenSt…...
使用Jmeter进行http接口测试怎么做?
前言: 本文主要针对http接口进行测试,使用Jmeter工具实现。 Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对Http接口的测试。 一、开发接…...
创建腾讯云存储桶---上传图片--使用cos-sdk完成上传
创建腾讯云存储桶—上传图片 注册腾讯云账号https://cloud.tencent.com/login 登录成功,选择右边的控制台 点击云产品,选择对象存储 创建存储桶 填写名称,选择公有读,私有写一直下一步,到创建 选择安全管理&#…...
12.3_黑马MybatisPlus笔记(上)
目录 02 03 04 05 06 07 编辑 thinking:system.out::println?编辑 thinking:list.of? 08 thinking:RequestParam和 ApiParam注解使用? thinking:RequestParam 和PathVariable的区别? 编辑 编…...
智能优化算法应用:基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.寄生捕食算法4.实验参数设定5.算法结果6.参考…...
网站设计需要什么/西安网络推广seo0515
C#一个到多个Cookie的字符串添加到CookieCollection集合中多个站点(Domain)与多个路径(Path)与多个Cookie名(c.name)的字符要添加到CookieCollection集合中在网上找不到可行的方法,isGood用一天…...
b站是什么网站/如何联系百度推广
Atitit.rsa密钥生成器的attilax总结 1.1. 密钥生成器 1 1.2. 生成固定的密钥 2 1.2.1. 设置或重置 SecureRandom 对象的随机数种子 2 1.3. 密钥结构 2 1.1. 密钥生成器 public static Map<String, Object> initKey2(String md5_deta) throws Exception{ /** RSA算法要…...
网站建设经营范围/公众号排名优化软件
PropertyDescriptor类: PropertyDescriptor类表示JavaBean类通过存储器导出一个属性。主要方法: 1. getReadMethod(),获得用于读取属性值的方法 2. getWriteMethod(),获得用于写入属性值的方法 注:…...
abcd设计官网/seo中文意思
点击上方蓝色字体,关注我们今天想写一下关于用qml创建QTabWidget的案例,查看了Qt Creator中的示例,发现有这个示例,就拿出来进行了修改。源示例请按照下图查找。对其进行了少许的修改,如下图当你打开这个项目你会发现它…...
百度上公司做网站/网络推广有哪些渠道
文章目录1.前序遍历1.1 递归1.2 非递归2.中序遍历2.1 递归2.2 非递归3.后序遍历3.1 递归3.2 非递归1.前序遍历 前序遍历的规则: 访问根节点前序遍历左子树前序遍历右子树 LeetCode144 二叉树的前序遍历 1.1 递归 class Solution {public List<Integer> p…...
景德镇市建设局建设信用网站/宜兴百度推广公司
jar包 Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.7.RELEASE 设置参数 配置 server:port: 10000servlet:context-path: /tomcat:max-connections: 10 #默认10000 接受和处理的最大连接数accept-count: 100 #默认100#默认10 初始化时创建的线程数 适当…...