我正在开发一个Qt C++应用程序。我需要下载一些文件(可能很大)并向用户显示下载进度。要执行此任务,我用这个代码:C++ Qt从QNetworkRequest获取HTTP标头
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)));
}
(我用QProgressBar命名progressBar
显示进度和QLabel命名labelProgress
显示下载的千字节)。
我的问题是我无法访问Content-Length标题(int fileSize
值为0),所以我无法显示操作的进度。我检查了我的web服务器上的HTTP头 - Content-Length工作正常。
在this SO question我读到我可以使用QNetworkReply::metaDataChanged()
信号,但是如何使用它来显示进度?文档说,下载已经开始,但我需要得到标题内容之前下载将开始 - 设置我的progressBar信号可以发射。