博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt队列下载文件
阅读量:2194 次
发布时间:2019-05-02

本文共 5831 字,大约阅读时间需要 19 分钟。

关于Qt下载,网络上例子很多,但是都是单个的下,如果是多个文件,可以控件一次下载多少个,然后等一个下载完了再下载其他的吗,Qt中有一个示例使用队列下载可以达到引效果

下面看具体的示例

#ifndef CDOWNLOADWORK_H#define CDOWNLOADWORK_H#include 
class CDownloadWork : public QObject{ Q_OBJECTpublic: explicit CDownloadWork(QObject *parent = nullptr); void startDownload(const int &index, const QString &url, const QString &path); ~CDownloadWork();signals: void signalDownloadFinished(const int &index); void signalDeleteLater();public slots: void slotReplyFinished(QNetworkReply *reply);private: QNetworkAccessManager m_netAccManage; int m_nIndex; QString m_strUrl{""}; QString m_strPath{""}; qint64 m_nFileSize{0};};#endif // CDOWNLOADWORK_H
#include "CDownloadWork.h"#include 
#include
#include
CDownloadWork::CDownloadWork(QObject *parent) : QObject(parent){}void CDownloadWork::startDownload(const int &index, const QString &url, const QString &path){ m_nIndex = index; m_strUrl = url; m_strPath = path; qDebug() << "CDownloadWork::startDownload====index==" << index << "==url==" << url << "==path==" << path; QNetworkRequest request; request.setUrl(QUrl(m_strUrl)); connect(&m_netAccManage, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotReplyFinished(QNetworkReply*))); m_netAccManage.get(request);}CDownloadWork::~CDownloadWork(){}void CDownloadWork::slotReplyFinished(QNetworkReply *reply){ if (reply->error() == QNetworkReply::NoError) { QByteArray bytes = reply->readAll(); // 缓存到本地 QFile file(m_strPath); if (file.open(QIODevice::Append)) file.write(bytes); file.close(); } reply->deleteLater(); emit signalDownloadFinished(m_nIndex); emit signalDeleteLater();}
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include 
#include
#include
struct DownloadParam{ int nIndex; QString url; QString path;};QT_BEGIN_NAMESPACEnamespace Ui { class MainWindow; }QT_END_NAMESPACEclass MainWindow : public QMainWindow{ Q_OBJECTpublic: MainWindow(QWidget *parent = nullptr); ~MainWindow(); void initView(); void initData(); void initConnect(); void addDownloadWork(const DownloadParam &downloadParam);public slots: void slotAddUrl(); void slotNextStartNextDownload(); void slotDownloadWorkFinished(const int &index);private: Ui::MainWindow *ui; int m_nDownloadCount{0}; QQueue
m_downloadQueue; QMutex m_MutexItem;};#endif // MAINWINDOW_H
#include "mainwindow.h"#include "ui_mainwindow.h"#include 
#include
#include "CDownloadWork.h"#include
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow){ ui->setupUi(this); initView(); initData(); initConnect();}MainWindow::~MainWindow(){ delete ui;}void MainWindow::initView(){}void MainWindow::initData(){}void MainWindow::initConnect(){ connect(ui->pushButton_addUrl, &QPushButton::clicked, this, &MainWindow::slotAddUrl);}/* 测试的url * http://mirrors.ustc.edu.cn/qtproject/archive/qt/5.12/5.12.0/submodules/qtwebglplugin-everywhere-src-5.12.0.zip * http://mirrors.ustc.edu.cn/qtproject/archive/qt/5.12/5.12.0/submodules/qtwayland-everywhere-src-5.12.0.zip * http://mirrors.ustc.edu.cn/qtproject/archive/qt/5.12/5.12.0/submodules/qtwebchannel-everywhere-src-5.12.0.zip * http://mirrors.ustc.edu.cn/qtproject/archive/qt/5.12/5.12.0/submodules/qtwebview-everywhere-src-5.12.0.zip * http://mirrors.ustc.edu.cn/qtproject/archive/qt/5.12/5.12.0/submodules/qtwinextras-everywhere-src-5.12.0.zip * http://mirrors.ustc.edu.cn/qtproject/archive/qt/5.12/5.12.0/submodules/qtx11extras-everywhere-src-5.12.0.zip * http://mirrors.ustc.edu.cn/qtproject/archive/qt/5.12/5.12.0/submodules/qtxmlpatterns-everywhere-src-5.12.0.zip * * * https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/16.04.6/ubuntu-16.04.7-server-amd64.template * https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/16.04.6/ubuntu-16.04.6-server-i386.template * */void MainWindow::slotAddUrl(){ QString url = ui->lineEdit->text(); if(url.isEmpty()) return; QFileInfo fileInfo(url); QString fileName = fileInfo.fileName(); QString path = QCoreApplication::applicationDirPath() + "/" + fileName; ++m_nDownloadCount; DownloadParam param; param.nIndex = m_nDownloadCount; param.url = url; param.path = path; addDownloadWork(param); qDebug() << "MainWindow::slotAddUrl====================url===" << url;}void MainWindow::addDownloadWork(const DownloadParam &downloadParam){ qDebug() << "MainWindow::addDownloadWork===================1===" << __LINE__; QMutexLocker locker(&m_MutexItem); m_downloadQueue.enqueue(downloadParam); if(!m_downloadQueue.isEmpty()) QTimer::singleShot(0, this, SLOT(slotNextStartNextDownload())); qDebug() << "MainWindow::addDownloadWork===================2===" << __LINE__;}void MainWindow::slotNextStartNextDownload(){ qDebug() << "MainWindow::slotNextStartNextDownload===================1===" << __LINE__; QMutexLocker locker(&m_MutexItem); if(m_downloadQueue.isEmpty()) return; DownloadParam downloadParam = m_downloadQueue.dequeue(); CDownloadWork *download = new CDownloadWork; connect(download, &CDownloadWork::signalDownloadFinished, this, &MainWindow::slotDownloadWorkFinished); connect(download, &CDownloadWork::signalDeleteLater, download, &QObject::deleteLater); download->startDownload(downloadParam.nIndex, downloadParam.url, downloadParam.path); qDebug() << "MainWindow::slotNextStartNextDownload===================2===" << __LINE__;}void MainWindow::slotDownloadWorkFinished(const int &index){ QString str = QStringLiteral("当前有%1个任务,第%2个任务下载完成。。。").arg(m_nDownloadCount).arg(index); qDebug() << str << __LINE__;}

 

 

 

转载地址:http://uriub.baihongyu.com/

你可能感兴趣的文章
(PAT 1145) Hashing - Average Search Time (哈希表冲突处理)
查看>>
(1129) Recommendation System 排序
查看>>
PAT1090 Highest Price in Supply Chain 树DFS
查看>>
(PAT 1096) Consecutive Factors (质因子分解)
查看>>
(PAT 1019) General Palindromic Number (进制转换)
查看>>
(PAT 1073) Scientific Notation (字符串模拟题)
查看>>
(PAT 1080) Graduate Admission (排序)
查看>>
Play on Words UVA - 10129 (欧拉路径)
查看>>
mininet+floodlight搭建sdn环境并创建简答topo
查看>>
【linux】nohup和&的作用
查看>>
Set、WeakSet、Map以及WeakMap结构基本知识点
查看>>
【NLP学习笔记】(一)Gensim基本使用方法
查看>>
【NLP学习笔记】(二)gensim使用之Topics and Transformations
查看>>
【深度学习】LSTM的架构及公式
查看>>
【python】re模块常用方法
查看>>
剑指offer 19.二叉树的镜像
查看>>
剑指offer 20.顺时针打印矩阵
查看>>
剑指offer 21.包含min函数的栈
查看>>
剑指offer 23.从上往下打印二叉树
查看>>
剑指offer 25.二叉树中和为某一值的路径
查看>>