Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QT C++;下载多个总进度为的文件_C++_Qt_Download_Qfile - Fatal编程技术网

C++ QT C++;下载多个总进度为的文件

C++ QT C++;下载多个总进度为的文件,c++,qt,download,qfile,C++,Qt,Download,Qfile,我实现了下载多个文件,但我不知道如何实现下载的总进度条,这是常见的 我的代码: QNetworkAccessManager manager; QList<QNetworkReply *> currentDownloads; void MainWindow::checkUpdate() { QStringList files; files << "http://cavexp.net/uploads/game/Theugry/zips/res

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

我的代码:

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);
}
QNetworkAccessManager;
QList当前下载;
void MainWindow::checkUpdate()
{
QStringList文件;
文件进度栏->设置最大值(总字节);
ui->progressBar->setValue(字节读取);
}

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

您可能需要反复浏览“当前下载”列表并连接到每个信号。然后将从所有插槽调用您的插槽。在该槽中,您必须汇总所有作为QNetworkReply::downloadProgress signal参数提供的信息

您可以为currentDownloads列表的每个QNetworkReply实例创建一个专用对象,这样您就可以知道信号来自哪个文件,但如果我没有弄错的话,您也可以为所有信号使用单个插槽,然后在Qt中有一个元函数,它会告诉您信号来自哪个发送方

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

实现一个类似这样的类“ProgressListener”(注意,我正在编写伪代码,您需要添加/修复一些必要的东西以使其实际工作):

比您的行
QList currentDownloads之后添加
QList下载列表。每次将新的
QNetworkReply
对象添加到
currentDownloads
时,在您的
foreach
中,还应: 1.创建
progressListener
的新实例,并将其添加到
downloadListeners
。 2.将特定QNetworkReply的信号连接到相应ProgressListener的插槽:
connect(回复,信号(下载进度(qint64,qint64)),pListenner,插槽(onDownloadProgress(qint64,qint64))

这样,每当某个QNetworkReply触发其进度信号时,就会调用相应ProgressListener的插槽

下一步是总结所有下载的数字。一个简单的方法是: 1.在
progressListener
类中再创建一个函数,并将其设置为
static
(重要)。假设函数名为
CommonProgress
。 2.在
onDownloadProgress
函数调用的末尾,也调用
CommonProgress

3.在
CommonProgress
函数(注意线程安全!)中,迭代
下载列表的所有元素,并总结它们的
\u lastKnownReceived
\u lastKnownTotal
。做必要的算术。。。不要忘记,
bytesTotal
可以是-1

管理器没有信号
downloadProgress
不是吗,也许你的意思是只
reply
连接(reply,信号(downloadProgress(qint64,qint64)),这个插槽(updateDownloadProgress(qint64,qint64))?@切尔诺贝利我不知道如何实现它。你能举一个有效的例子吗?我将非常感激@切尔诺贝利事故。切尔诺贝利:访问网络经理, который бы сообщал прогресс. СааааааааааааааажжаажаааQNetworkReplyааааф2;аааа107。СМиииииаа-(иааиаиаиаиаиааcurrentDownload=manager.get(请求);@mvidelgauzаааааааа,эаааааа。Как реализовать общий прогресс бар скачивания нескольких файлов? Заранее спасибо!Спасибо, что откликнулись! Если честно, не представляю как это реализовать. Вы можете показать небольшой пример? Я был бы очень благодарен!  谢谢你的帮助!老实说,我不知道如何实施它。你能举个小例子吗?我将非常感激@约翰:我在回答中添加了一些伪代码。如果你需要更多的解释,请告诉我。再次感谢您,但我只是部分地意识到,如果您能更详细地告诉我,那将是非常好的。如果你愿意,我可以把整个项目都扔掉michael@videlgauz.com, хотя мне кажется, что это противоречит правилам этого сайта. В любом случае, без самостоятельной работы Вам не обойтись )))
class ProgressListenner
{
   public:
   ProgressListenner() : _lastKnownReceived(0), _lastKnownTotal(0){}

   qint64 _lastKnownReceived;
   qint64 _lastKnownTotal;

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