簡體   English   中英

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)));
}

(我使用QProgressBar命名為progressBar來顯示進度,並使用QLabel命名為labelProgress來顯示下載的千字節)。

我的問題是我無法訪問Content-Length標頭( int fileSize值為0),因此無法顯示操作進度。 我在網絡服務器上檢查了HTTP標頭-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的finish(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()))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM