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

标签 c++ qt download qfile

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

我的代码:

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 实例创建一个专用对象,以便您知道即将到来的信号属于哪个文件,但如果我没记错的话,您也可以为所有这些使用单个插槽,然后有Qt 中的一个元函数,它会告诉您信号来自哪个发送者。

附言为了响应您对这里的小示例的请求,这里是“直接”方法(不使用 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 的新实例并将其添加到 downloadListenners . 2. 将该特定 QNetworkReply 的信号连接到相应的 ProgressListenner 插槽:connect(reply, SIGNAL(downloadProgress(qint64, qint64)), pListenner, SLOT(onDownloadProgress (qint64, qint64)));

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

下一步是汇总所有下载的数字。一种简单的方法是: 1. 在ProgressListenner中再创建一个函数上课并制作static (重要的)。假设函数的名称是 CommonProgress . 2. onDownloadProgress结尾函数调用也调用 CommonProgress 3.在CommonProgress函数(注意线程安全!)遍历 downloadListenners 的所有元素总结他们的_lastKnownReceived_lastKnownTotal .做必要的算术......不要忘记bytesTotal可以是-1!!!

关于c++ - QT C++ 下载多个文件,总进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26830075/

相关文章:

php - 限制文件下载

java - 从 MySQL 下载 Android App 数据的有效方法

c++ - Golang CGO异常0x40010006

c++ - 为什么这个函数模板调用有效?

c++ - 在 qmlRegisterSingletonType 中使用非静态方法

c++ - Qt 错误 : Can't declared multiple mainwindows in main. cpp

c++ - Qt - 如何从线程创建 QFuture

c++ - 如何获取没有分配盘符的卷的卷文件系统?

c++ - 我什么时候应该提供 move 感知过载?

Android-通过 URL 命名问题将 mp3 下载到 SDCARD