我使用的是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时,应用程序就会崩溃。如何等待请求完成,然后在一个函数中处理应答
发布于 2011-03-31 07:20:43
您可以使用事件循环:
QEventLoop loop;
connect(netReply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
// here you have done.另外,您应该考虑添加一些比网络超时更短的时间(20?)。即使发生错误,我也不确定是否调用了finished。所以这是有可能的,你也有连接错误信号。
发布于 2011-03-30 12:45:22
首先,我建议您从Qt文档参考中阅读相关文档,您可以在这里找到:http://doc.qt.nokia.com/latest/classes.html。
看一下您的代码示例,您似乎已经和QNetworkRequest和QNetworkReply一起拥有了一个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。这里有个例子
http://wiki.forum.nokia.com/index.php/How_to_wait_synchronously_for_a_Signal_in_Qt
发布于 2021-05-22 05:04:09
这里的答复都使用旧的语法,不适用于最新的QT。
若要等待网络请求完成:
QEventLoop loop;
connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();https://stackoverflow.com/questions/5486090
复制相似问题