// 发出 Get 请求(这个地方看你的 url 需要 get 还是 post,自己改) QNetworkReply *reply = manager.get(QNetworkRequest(url)); // 忽略 SSL 错误 reply->ignoreSslErrors(); if (!reply) { qDebug() << "replay error!"; return -1; // 有数据则退出 loop connect(reply, SIGNAL(readyRead()), &loop, SLOT(quit())); // 请求完成则退出 loop connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); // 超时则退出 loop connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); // 超时 5s timer.start(1000 * 5); loop.exec(); if (!timer.isActive()) // 请求超时超时,未获取到文件信息; qDebug() << "Request Timeout"; return -1; timer.stop(); QVariant var = reply->header(QNetworkRequest::ContentLengthHeader); size = var.toLongLong(); if (size == 0) { if (reply->hasRawHeader(QString("Content-Length").toUtf8())) QString fileSize = reply->rawHeader(QString("Content-Length").toUtf8()); LOG(INFO) << "fileSize:" << fileSize.toStdString() << " bytes"; size = fileSize.toLongLong(); qDebug() << "size:" << size << " bytes"; reply->deleteLater(); return size;

3 注意事项

如果没有报错,size = 0,可能并未触发 readyRead 信号,需要考虑此处

QNetworkReply *reply = manager.get(QNetworkRequest(url));

可以用 postman 或抓包先进行确定

4 运行效果

传入 https://www.baidu.com,效果如下:

5 参考资料

1、Qt 之 HTTP 请求 多线程分块下载——上(获取下载文件大小)- 前行中的小猪 - https://blog.csdn.net/GoForwardToStep/article/details/53159360

2、QT之HTTP下载获取文件大小信息 - 苍月代表我 - https://www.cnblogs.com/lifan3a/articles/7691974.html

3、Qt 5.9.9 demo

4、Qt 5.4.12 demo