16

我正在使用 Qt 4.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,因此应用程序崩溃。如何等到请求完成,然后在一个函数中处理回复

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

首先,我建议您阅读 Qt 文档参考中的相关文档,您可以在此处找到:http: //doc.qt.nokia.com/latest/classes.html

查看您的代码示例,您似乎已经拥有了,除了QNetworkRequestand QNetworkReply, a QNetworkAccessManager。您需要将插槽连接到finished(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。你有一个例子here

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 回答