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的…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
