c++ Qt从QNetworkRequest获取HTTP头
C++ Qt get HTTP headers from QNetworkRequest
我正在开发一个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来显示下载的kb)。
我的问题是我无法访问内容长度头(int fileSize
值为0),因此我无法显示操作的进度。我检查了HTTP头在我的web-server - Content-Length工作正常。
在这个SO问题中,我读到我可以使用QNetworkReply::metaDataChanged()
信号,但我如何使用它来显示进度?文档说,信号可以发出时,下载已经开始,但我需要得到标题内容之前,下载将开始-设置我的progressBar
这不是你从请求中获取报头信息的方式:
QNetworkRequest request(fileUrl); //fileUrl is a QUrl variable
QVariant responseLength = request.header(QNetworkRequest::ContentLengthHeader);
int fileSize = responseLength.toInt();
ui->progressBar->setMaximum(fileSize);
尝试用QNetworkAccessManager发出请求,然后从它返回的应答中获得您想要的标头。有一种特殊的方法可以只从请求中检索报头信息:
QNetworkAccessManager::head(const QNetworkRequest & request)
由于Qt的网络API是异步的,你必须将QNetworkAccessManager的finished(QNetworkReply*)信号连接到插槽,并在插槽中获得报头信息。
我是这样做的:
void MainWindow::on_download_button_clicked(){
QUrl url("http://someurl");
QNetworkAccessManager * manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(getHeaders(QNetworkReply*)));
manager->head(QNetworkRequest(url));
}
void MainWindow::getHeaders(QNetworkReply * reply){
if (reply->operation() == QNetworkAccessManager::HeadOperation){
int content_length = reply->header(QNetworkRequest::ContentLengthHeader).toInt();
}
}
您是否尝试过使用readyRead信号?在槽中,你可以准备GUI。应该这样做:
connect(reply, SIGNAL(readyRead()), this, SLOT(updateProgressBar()))
相关文章:
- 如何使用C++和Boost Asio从HTTP发布请求中获取键值
- 在客户端和备忘录中获取 HTTP 命令
- 如何在C++中使用带有SFML的http reqest从节点.js服务器获取数据?
- 如何从Qt QWebEngineView获取HTTP状态代码
- 在确定有实现的情况下获取HTTP 501未实现
- 如何在C++中使用 Curl 获取 HTTP 响应字符串
- 带有边界获取错误的 HTTP POST
- C 从HTTP响应中获取图片
- 如何保存HTTP的JSON响应在C 中获取.json文件
- 有关如何使用cpp-netlib进行异步HTTP获取请求的示例
- Webkit GTK:获取HTTP响应
- 从Poco http客户端获取对字符串的响应
- 我无法使用 libcurl 获取 http 代码 404
- 使用C++获取HTTP get参数
- apache/nginx-执行从http请求获取params的程序
- 如何从 http 请求中获取客户端 IP
- 使用HTTP上载文件.获取错误:-HttpSendReuest 12005
- 获取HTTP请求(Arduino)
- 在c++中获取字节范围的HTTP GET请求
- 简单的HTTP获取与Winsock