0

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 と、ダウンロードされたキロバイトを表示するために名前が付けられた QLabelを使用labelProgressします)。

私の問題は、Content-Length ヘッダー (int fileSize値は 0) にアクセスできないため、操作の進行状況を表示できないことです。Web サーバーで HTTP ヘッダーを確認しました - Content-Length は正常に動作します。

このSOの質問では、シグナルを使用できることを読みましたQNetworkReply::metaDataChanged()が、それを使用して進行状況を表示するにはどうすればよいですか? ドキュメントには、ダウンロードが既に開始されているときに信号を送信できると書かれていますが、ダウンロードが開始される前にヘッダーコンテンツを取得する必要があります-progressBarを設定します。

4

2 に答える 2

6

これは、リクエストからヘッダー情報を取得する方法ではありません。

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();
    }
}
于 2013-12-05T18:53:03.440 に答える