開発プラットフォームは VS2022+Qt コンポーネントであり、QtCreator とは若干異なる可能性があります。
1. プロジェクトに Network ライブラリを設定する#
Qt のインストールディレクトリには、include フォルダと lib フォルダがあります。それぞれ QtNetwork フォルダと Qt6Network.lib(デバッグビルドの場合は Qt6Networkd.lib、Qt5 の場合は Qt5Network.lib)のフォルダが見つかります。
プロジェクトのプロパティで、C/C++--> 一般 --> 追加のインクルードディレクトリに以下の行を追加します。
$(QTDIR)\include\QtNetwork
プロジェクトのプロパティで、リンカー --> 入力 --> 追加の依存ファイルに以下の行を追加します。
$(QTDIR)\lib\Qt6Network.lib
リリースモードの場合も同様にヘッダーファイルとライブラリファイルを設定してください。
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 は非同期であり、naManager が関数を終了すると自動的に破棄されます)。
次に、naManager の finished (QNetworkReply*) シグナルを requestFinished (QNetworkReply*) スロット関数にバインドします。
request の HTTP リクエスト URL を設定し、GET リクエストのレスポンスを取得するために reply オブジェクトを作成します。
void requestFinished(QNetworkReply* reply) {
QString Result;
// HTTPステータスコードを取得する
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if (statusCode.isValid())
Result+=QString("ステータスコード=%1\n").arg(statusCode.toInt());
QVariant reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();
if (reason.isValid())
Result+=QString("理由=%1\n").arg(reason.toString());
QNetworkReply::NetworkError err = reply->error();
if (err != QNetworkReply::NoError) {
Result+=QString("失敗:%1\n").arg(reply->errorString());
}
else {
// レスポンスの内容を取得する
Result+= reply->readAll();
}
ui.Result->setText(Result);
}
以前に reply オブジェクトを使用してレスポンスを取得しましたが、ここではレスポンスを解析します。
参考記事:https://blog.csdn.net/china_jeffery/article/details/83246355