开发平台为 VS2022+Qt 组件,可能与 QtCreator 略有不同
1. 为项目配置 Network 库#
Qt 安装目录下的应当有 include 文件夹和 lib 文件夹,其中分别可以找到文件夹 QtNetwork 与文件 Qt6Network.lib (Debug 编译为 Qt6Networkd.lib,Qt5 为 Qt5Network.lib)
在项目属性中 C/C++--> 常规 --> 附加包含目录中添加行
$(QTDIR)\include\QtNetwork
在项目属性中链接器 --> 输入 --> 附加依赖库中添加行
$(QTDIR)\lib\Qt6Network.lib
Release 模式同理自行配置头文件和库文件
2. 头文件#
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
QtNetwork 是异步的,每个进程中需要一个 QNetworkAccessManager 对象来进行网络对象管理
我们将通过 QNetworkRequest 进行请求
通过 QNetworkReply 获取响应
3. 函数实现#
//QtNetwork.cpp
connect(ui.GETButton, SIGNAL(clicked()), this, SLOT(onGETButtonClicked()));
假设将 GETButton 的点击信号与槽函数 onGETButtonClicked 进行绑定
//QtNetwork.hpp private slots:
void onGETButtonClicked() {
QNetworkRequest request;
QNetworkAccessManager* naManager = new QNetworkAccessManager(this);
connect(naManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(requestFinished(QNetworkReply*)));
request.setUrl(QUrl("https://www.baidu.com"));
QNetworkReply* reply = naManager->get(request);
}
首先建立 QNetworkAccessManager 和 QNetworkRequest 对象,naManager 请用 new 建立(前面提到 QNetwork 是异步的,不阻塞的情况下 QNetworkAccessManager 退出函数就会被销毁)
接着将 naManager 的 finished (QNetworkReply*) 信号与槽函数 requestFinished (QNetworkReply*) 绑定
设置 request 的 HTTP 请求 Url,并建立对象 reply 获取 GET 请求响应
void requestFinished(QNetworkReply* reply) {
QString Result;
// 获取http状态码
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if (statusCode.isValid())
Result+=QString("status code=%1\n").arg(statusCode.toInt());
QVariant reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();
if (reason.isValid())
Result+=QString("reason=%1\n").arg(reason.toString());
QNetworkReply::NetworkError err = reply->error();
if (err != QNetworkReply::NoError) {
Result+=QString("Failed: %1\n").arg(reply->errorString());
}
else {
// 获取返回内容
Result+= reply->readAll();
}
ui.Result->setText(Result);
}
先前使用 reply 获取响应结果,在这里解析响应即可
参考文章:https://blog.csdn.net/china_jeffery/article/details/83246355