yol*_*olo 12 networking qt qt4 qnetworkaccessmanager
我正在使用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;
Run Code Online (Sandbox Code Playgroud)
因为这个函数返回一个空的QStringList,应用程序崩溃了.如何等待请求完成,然后在一个函数内处理回复
Kam*_*mek 36
您可以使用事件循环:
QEventLoop loop;
connect(netReply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
// here you have done.
Run Code Online (Sandbox Code Playgroud)
你还应该考虑添加一些更短的网络超时(20秒?).即使发生错误,我也不确定是否已完成调用.所以你有可能连接到错误信号.
这里的这些回复都使用旧语法,不适用于最新的QT。
等待网络请求完成:
QEventLoop loop;
connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();
Run Code Online (Sandbox Code Playgroud)
首先,我建议您阅读Qt文档参考中的相关文档,您可以在此处找到:http://doc.qt.nokia.com/latest/classes.html.
看看你的代码示例,你似乎已经拥有了,QNetworkRequest和QNetworkReplya一起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")));
Run Code Online (Sandbox Code Playgroud)
现在,在您的插槽中,您可以读取为响应您的请求而发送的数据.就像是:
void MyClass::MySlot(QNetworkReply *data) {
QFile file("dataFromRequest");
if (!file.open(QIODevice::WriteOnly))
return;
file.write(data->readAll());
file.close();
}
Run Code Online (Sandbox Code Playgroud)
编辑:
要同步等待信号,请使用QEventLoop.你有一个例子
http://wiki.forum.nokia.com/index.php/How_to_wait_synchronously_for_a_Signal_in_Qt
| 归档时间: |
|
| 查看次数: |
24435 次 |
| 最近记录: |