所以,我试图在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”函数在检索后简单地返回字符串,这似乎不可能在它需要等待完成的信号的帐户上,此时无法“获取”返回任何内容被检索通过“完成”的插槽。有没有替代上述方法或有没有办法我可以“获取”返回“完成”检索的内容?任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
异步呼叫不是问题 - 它是一个巨大的胜利。通过同步调用,您实际上可能浪费数百个可疑的RAM和一个完整的线程,只是空闲地等待某些东西回来。你不能写这样的代码,同时假装事情是同步发生的,甚至是快速的#34;对于这个问题。我甚至没有评论在GUI线程中运行这种同步代码的疯狂。运行本地事件循环也是一个非常糟糕的主意,因为突然所有的GUI代码都变得可重入。我敢打赌,你既不设计也不测试。
您必须将期望结果的代码分解为两部分:第一部分需要发出请求。第二部分在一个槽中,在请求完成时得到通知,并继续做任何要做的事情。
如果您希望在一个方法中使用它,请使用C ++ 11:
QNetworkAccessManager * mgr = ...;
QObject::connect(mgr, &QNetworkAccessManager::finished,
[this, mgr](QNetworkReply * reply){
// here you can do things with the reply
});
mgr->get(QNetworkRequest("....");
有关完整的示例,see this 300-line photographic mosaic generator从imgur中提取随机图像。它以上述风格广泛使用异步,多线程处理和lambdas。