開發平台為 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