在 Qt 中返回网页内容的最快方法是啥?
Posted
技术标签:
【中文标题】在 Qt 中返回网页内容的最快方法是啥?【英文标题】:What's the quickest way to return the contents of a webpage in Qt?在 Qt 中返回网页内容的最快方法是什么? 【发布时间】: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 使其同步 【参考方案1】:异步调用不是问题 - 这是一个巨大的胜利。使用同步调用,您实际上是在浪费可能数百 KB 的 RAM 和整个线程,只是在无所事事地等待返回。你不能写这样的代码,同时假装事情是同步发生的,甚至是“快速”发生的。我什至不会评论在 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 中提取随机图像。它广泛使用上述风格的异步、多线程处理和 lambda。
【讨论】:
以上是关于在 Qt 中返回网页内容的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章