在 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 中返回网页内容的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

从网页中删除除文本之外的所有内容的最佳方法是啥?

QT打开一个网页,并获取网页内容,该怎么处理

QT:从网页获取文本内容

使用 Qt 5.5 或 5.6 打印网页的 HTML/内容

易语言 如何读取网页源文件的代码!

网页中的基本元素是啥?