QT C ++下载多个文件,总计进度

约翰

我意识到可以下载多个文件,但是我不知道如何实现下载的总进度条,这很常见。

我的代码:

QNetworkAccessManager manager;
QList<QNetworkReply *> currentDownloads;

void MainWindow::checkUpdate()
{
        QStringList files;
        files << "http://cavexp.net/uploads/game/Theugry/zips/resourcepacks.zip"
              << "http://cavexp.net/uploads/game/Theugry/zips/resourcepacks.zip";

        doDownload(files);
}

void MainWindow::doDownload(const QVariant& v)
{
    if (v.type() == QVariant::StringList) {
        foreach (QString url, v.toStringList()) {
            QNetworkReply* reply = manager.get(QNetworkRequest(QUrl(url)));

            connect(&manager, SIGNAL(downloadProgress(qint64, qint64)),
                this, SLOT(updateDownloadProgress(qint64, qint64)));

            currentDownloads.append(reply);
        }
    }
}

void MainWindow::downloadFinished(QNetworkReply *reply)
{
    currentDownloads.removeAll(reply);
    reply->deleteLater();
}

void MainWindow::updateDownloadProgress(qint64 bytesRead, qint64 totalBytes)
{
    ui->progressBar->setMaximum(totalBytes);
    ui->progressBar->setValue(bytesRead);
}

如果有任何帮助和提示,我将不胜感激!谢谢你。

姆维德尔高兹

您可能需要遍历“ currentDownloads”列表,并连接到每个人的信号downloadProgress然后将从所有插槽中调用您的插槽。在该插槽中,您将必须汇总作为QNetworkReply :: downloadProgress信号的参数而来的所有信息。

您可以为currentDownloads列表的每个QNetworkReply实例创建一个专用对象,以便知道即将到来的信号属于哪个文件,但是如果我没有记错的话,也可以对所有信号使用单个插槽,然后有一个meta函数在Qt中,它将告诉您信号来自哪个发送者。

PS为响应您对小示例的请求,这里是“直接”方法(不使用QSignalMapper或QObject :: sender()):

实现一个类似这样的类“ ProgressListenner”(请注意,我正在编写伪代码,您需要添加/修复一些必不可少的东西才能使其真正起作用):

class ProgressListenner
{
   public:
   ProgressListenner() : _lastKnownReceived(0), _lastKnownTotal(0){}

   qint64 _lastKnownReceived;
   qint64 _lastKnownTotal;

   slots:
      onDownloadProgress ( qint64 bytesReceived, qint64 bytesTotal )
      {
          _lastKnownReceived = bytesReceived;
          _lastKnownTotal = bytesTotal;
      }
}

比起您的行后QList<QNetworkReply *> currentDownloads;添加QList<ProgressListenner*> downloadListenners;foreach每次内部都向其中添加新QNetworkReply对象时currentDownloads:1.创建的新实例ProgressListenner并将其添加到中downloadListenners2.将特定QNetworkReply的信号连接到相应的ProgressListenner的插槽:connect(reply, SIGNAL(downloadProgress(qint64, qint64)), pListenner, SLOT(onDownloadProgress (qint64, qint64)));

这样,每次QNetworkReply触发其进度信号时,就会调用相应的ProgressListenner的插槽。

下一步是汇总所有下载的数字。一种简单的方法是:1.在ProgressListenner类中再创建一个函数并将其设置为static(重要的)。假设函数的名称为CommonProgress2.在结束onDownloadProgress函数调用也呼吁CommonProgress3.在CommonProgress函数(照顾约线程安全!)叠代的所有元素downloadListenners,并总结自己的_lastKnownReceived_lastKnownTotal做必要的算术...不要忘了bytesTotal可以是-1 !!!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章