「Qtの基礎 - ネットワーク」の版間の差分

ナビゲーションに移動 検索に移動
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>

案内メニュー