QtのQNetworkAccessManagerで同期通信

  • 6
    Like
  • 0
    Comment
More than 1 year has passed since last update.

QNetworkAccessManagerで通信し、結果を受け取るにはQNetworkAccessManager::finishedシグナルを受け取らなければならない。コードで書くとこうなる。

void ClassName::get() {
    QNetworkAccessManager *manager = new QNetworkAccessManager();

    connect(manager SIGNAL(finished(QNetworkReply*)),
            this, SLOT(finishSlot(QNetworkReply*)));
    manager->get(QUrl("http://127.0.0.1/index.html"));
}

// SLOT
void ClassName::finishedSlot(QNetworkReply *reply) {
    // 受信結果replyをゴニョゴニョ
}

同期通信したい場合は、QEventLoopを使用する。

void ClassName::get() {
    QNetworkAccessManager *manager = new QNetworkAccessManager();

    QEventLoop eventLoop;
    connect(manager, SIGNAL(finished(QNetworkReply*)),
            &eventLoop, SLOT(quit()));
    QNetworkReply *reply = manager->get(QUrl("http://127.0.0.1/index.html"));
    eventLoop.exec();       // eventLoop.exec()終了後、replyにはGETの結果が格納されている

    // 続けて受信結果replyをゴニョゴニョできる
}

参考文献

http://qt-project.org/forums/viewthread/10150