我实现了下载多个文件,但是我不知道如何实现下载的总进度条,这很常见。
我的代码:
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/