Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;Qt从QNetworkRequest获取HTTP头 我正在开发一个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))); void downloadProgressChanged(qint64 downloaded, qint64 total) { ui->progressBar->setValue(ui->progressBar->value() + 1); ui->labelProgress->setText(QString::number((downloaded / 1024))); }_C++_Qt_Http Headers_Qnetworkaccessmanager - Fatal编程技术网

C++;Qt从QNetworkRequest获取HTTP头 我正在开发一个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))); void downloadProgressChanged(qint64 downloaded, qint64 total) { ui->progressBar->setValue(ui->progressBar->value() + 1); ui->labelProgress->setText(QString::number((downloaded / 1024))); }

C++;Qt从QNetworkRequest获取HTTP头 我正在开发一个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))); void downloadProgressChanged(qint64 downloaded, qint64 total) { ui->progressBar->setValue(ui->progressBar->value() + 1); ui->labelProgress->setText(QString::number((downloaded / 1024))); },c++,qt,http-headers,qnetworkaccessmanager,C++,Qt,Http Headers,Qnetworkaccessmanager,其中downloadProgressChanged是带有此代码的插槽: QNetworkAccessManager* networkManager = new QNetworkAccessManager(); QNetworkRequest request(fileUrl); //fileUrl is a QUrl variable QVariant responseLength = request.header(QNetworkRequest::ContentLengthHeader); i

其中
downloadProgressChanged
是带有此代码的插槽:

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)));
void downloadProgressChanged(qint64 downloaded, qint64 total)
{
    ui->progressBar->setValue(ui->progressBar->value() + 1);
    ui->labelProgress->setText(QString::number((downloaded / 1024)));
}
(我使用名为
progressBar
的QProgressBar显示进度,使用名为
labelProgress
的QLabel显示下载的千字节)

我的问题是无法访问内容长度标题(
int fileSize
值为0),因此无法显示操作的进度。我在web服务器上检查了HTTP头-内容长度正常


在我读到的文章中,我可以使用
QNetworkReply::metaDataChanged()
信号,但如何使用它来显示进度?文档说明下载已经开始时可以发出信号,但我需要在下载开始之前获取标题内容,以设置我的进度条。

您尝试过使用readyRead信号吗?在插槽中,您可以准备GUI。像这样的东西应该会起作用:

connect(reply, SIGNAL(readyRead()), this, SLOT(updateProgressBar()))

这不是从请求中获取头信息的方式:

QNetworkRequest request(fileUrl); //fileUrl is a QUrl variable
QVariant responseLength = request.header(QNetworkRequest::ContentLengthHeader);
int fileSize = responseLength.toInt();
ui->progressBar->setMaximum(fileSize);
QNetworkAccessManager::head(const QNetworkRequest & request)
尝试使用QNetworkAccessManager发出请求,然后从它返回的回复中获取所需的标题。有一种特殊的方法可以仅从请求中检索头信息:

QNetworkRequest request(fileUrl); //fileUrl is a QUrl variable
QVariant responseLength = request.header(QNetworkRequest::ContentLengthHeader);
int fileSize = responseLength.toInt();
ui->progressBar->setMaximum(fileSize);
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();
    }
}