13,005
回編集
134行目: | 134行目: | ||
return app.exec(); | return app.exec(); | ||
} | } | ||
</syntaxhighlight> | |||
<br> | |||
==== 非同期で取得 (タイムアウト設定あり) ==== | |||
以下の例では、<code>QNetworkAccessManager</code>クラスを使用して、Webページのデータを非同期に取得して、<code>QTimer</code>クラスでタイムアウトを実装している。<br> | |||
<code>QTimer::timeout</code>シグナルを使用して、指定した時間が経過した後に接続を中断 (<code>reply->abort()</code>) することにより、タイムアウト処理を行っている。<br> | |||
<br> | |||
また、<code>QNetworkReply::finished</code>シグナルを使用して、リクエストの完了を検知して、結果を出力している。<br> | |||
<syntaxhighlight lang="c++"> | |||
#include <QNetworkAccessManager> | |||
#include <QNetworkReply> | |||
#include <QTimer> | |||
// QNetworkAccessManagerのインスタンスを作成 | |||
QNetworkAccessManager manager; | |||
// Webページを取得するためのリクエストを作成 | |||
QNetworkRequest request(QUrl("http://www.example.com")); | |||
// リクエストを送信し、応答を受け取るためのQNetworkReplyオブジェクトを取得 | |||
QNetworkReply *reply = manager.get(request); | |||
// タイマオブジェクトを生成して、3秒後にタイムアウトするように設定 | |||
QTimer timer; | |||
timer.setSingleShot(true); | |||
timer.start(3000); // 3秒後にタイムアウト | |||
// タイマがタイムアウトした場合の処理を記述 | |||
QObject::connect(&timer, &QTimer::timeout, [&]() { | |||
if (reply->isRunning()) { | |||
// リクエストがまだ完了していない場合、接続を中断 | |||
reply->abort(); | |||
std::cout << QString("タイムアウトしました").toStdString() << std::endl; | |||
} | |||
}); | |||
// リクエストが完了した場合の処理を接続 | |||
QObject::connect(reply, &QNetworkReply::finished, [&]() { | |||
if (reply->error() == QNetworkReply::NoError) { | |||
// リクエストが成功して、エラーがない場合は成功 | |||
QByteArray responseData = reply->readAll(); | |||
std::cout << QString("受信データ : %1").arg(responseData).toStdString() << std::endl; | |||
} | |||
else if (reply->error() == QNetworkReply::OperationCanceledError) { | |||
std::cout << QString("リクエストがキャンセルされました").toStdString() << std::endl; | |||
} | |||
else { | |||
std::cout << QString("受信データ : %1").arg(reply->errorString()).toStdString() << std::endl; | |||
} | |||
reply->deleteLater(); | |||
}); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | <br><br> |