【发布时间】:2014-04-21 18:35:02
【问题描述】:
所以,我试图在 Qt 中运行一些简单的代码来返回给定网页的内容。经过快速研究,我能够开发自己的课程来简化流程:
WebFetch::WebFetch()
{
nam = new QNetworkAccessManager(this);
connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*)));
}
QString WebFetch::get(QString url)
{
nam->get(QNetworkRequest(QUrl(url)));
}
void WebFetch::finished(QNetworkReply* reply)
{
QByteArray data = reply->readAll();
QString str(data);
}
但是,我发现上述代码的一个大问题是调用是异步的。我希望“get”函数在检索到字符串后简单地返回字符串,这似乎是不可能的,因为它需要等待完成的信号,此时没有办法让“get”返回检索到的任何内容由“完成”插槽。是否有上述方法的替代方法,或者有什么方法可以让“get”返回“finished”检索到的内容?任何帮助将不胜感激。谢谢!
【问题讨论】:
-
你可以在没有 Qt 的情况下做到这一点,可能使用 nstreams,效果很好。
-
正如你所说,Qt 是完全异步的,在 Qt 事件循环的帮助下。即使异步看起来也很烦人,但它很强大,例如,为了保存一些错误情况,或者如果 Web 服务器需要几秒钟来响应......
-
您可以运行本地 QEventLoop 使其同步
标签: c++ qt http qnetworkaccessmanager qnetworkrequest