16

Qt4.6.3と次の機能しないコードを使用しています

QStringList userInfo;
QNetworkRequest netRequest(QUrl("http://api.stackoverflow.com/1.1/users/587532"));
QNetworkReply *netReply = netman->get(netRequest);

// from here onwards not working
netReply->waitForReadyRead(-1);
if (netReply->isFinished()==true)
{userInfo << do sth to reply;}
return userInfo;

この関数が空のQStringListを返すと、アプリがクラッシュします。リクエストが終了するまで待ってから、1つの関数内で応答を処理する方法

4

3 に答える 3

43

イベントループを使用できます。

QEventLoop loop;
connect(netReply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
// here you have done.

また、ネットワークタイムアウトよりも短い時間(20秒?)を追加することを検討する必要があります。エラーが発生してもfinishedが呼び出されるかどうかはわかりません。したがって、エラー信号にも接続している可能性があります。

于 2011-03-31T07:20:43.783 に答える
5

まず、http: //doc.qt.nokia.com/latest/classes.htmlにあるQtドキュメントリファレンスから関連するドキュメントを読むことをお勧めします。

コードサンプルを見ると、とQNetworkRequestと一緒に、がすでにあるようです。必要なのは、スロットを信号に接続することです。この信号は、保留中のネットワーク応答が終了するたびに発行されます。QNetworkReplyQNetworkAccessManagerfinished(QNetworkReply *)

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
        this, SLOT(replyFinished(QNetworkReply*)));

manager->get(QNetworkRequest(QUrl("http://api.stackoverflow.com")));

これで、スロットで、要求に応じて送信されたデータを読み取ることができます。何かのようなもの:

void MyClass::MySlot(QNetworkReply *data) {
    QFile file("dataFromRequest");
    if (!file.open(QIODevice::WriteOnly))
        return;
    file.write(data->readAll());
    file.close();
}

編集:

シグナルを同期的に待機するには、QEventLoopを使用します。ここに例があります

http://wiki.forum.nokia.com/index.php/How_to_wait_synchronously_for_a_Signal_in_Qt

于 2011-03-30T12:45:22.900 に答える
1

ここでのこれらの応答はすべて古い構文を使用しており、最新のQTには適用されません。

ネットワーク要求が終了するのを待つには:

QEventLoop loop;
connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();
于 2021-05-22T05:04:09.370 に答える