【发布时间】:2013-04-18 14:43:38
【问题描述】:
我正在开发一个 Qt C++ 应用程序。我需要下载一些文件(可能很大)并向用户显示下载进度。要执行此任务,我使用以下代码:
QNetworkAccessManager* networkManager = new QNetworkAccessManager();
QNetworkRequest request(fileUrl); //fileUrl is a QUrl variable
QVariant responseLength = request.header(QNetworkRequest::ContentLengthHeader);
int fileSize = responseLength.toInt();
ui->progressBar->setMaximum(fileSize);
QNetworkReply reply = networkManager->get(request);
QObject::connect(reply, SIGNAL(downloadProgress(qint64,qint64)),
this, SLOT(downloadProgressChanged(qint64,qint64)));
其中downloadProgressChanged 是具有此代码的插槽:
void downloadProgressChanged(qint64 downloaded, qint64 total)
{
ui->progressBar->setValue(ui->progressBar->value() + 1);
ui->labelProgress->setText(QString::number((downloaded / 1024)));
}
(我使用名为 progressBar 的 QProgressBar 来显示进度,使用名为 labelProgress 的 QLabel 来显示下载的千字节)。
我的问题是我无法访问 Content-Length 标头(int fileSize 值为 0),因此无法显示操作进度。我检查了我的网络服务器上的 HTTP 标头 - Content-Length 工作正常。
在this SO question 中我读到我可以使用QNetworkReply::metaDataChanged() 信号,但我如何使用它来显示进度?文档说下载已经开始时可以发出信号,但我需要在下载开始之前获取标题内容 - 以设置我的progressBar。
【问题讨论】:
标签: c++ qt http-headers qnetworkaccessmanager