本文共 5831 字,大约阅读时间需要 19 分钟。
关于Qt下载,网络上例子很多,但是都是单个的下,如果是多个文件,可以控件一次下载多少个,然后等一个下载完了再下载其他的吗,Qt中有一个示例使用队列下载可以达到引效果
下面看具体的示例
#ifndef CDOWNLOADWORK_H#define CDOWNLOADWORK_H#includeclass 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/