Qt同步QNetworkAccessManager获取

Posted

技术标签:

【中文标题】Qt同步QNetworkAccessManager获取【英文标题】:Qt synchronous QNetworkAccessManager get 【发布时间】:2012-08-06 12:30:12 【问题描述】:

同步 QNetworkAccessManager::get 的正确方法是什么?

qt wiki 提供了一种方法,但指出“不建议在实际应用程序中使用它”。 mailinglist 提供了与 wiki 类似的解决方案。

【问题讨论】:

【参考方案1】:

Yum 可能会使用这样的东西:

QEventLoop loop;
connect(_netReply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();

【讨论】:

不错的答案,超时支持会更好。【参考方案2】:

wiki 和 yttrium 的回答中提到的简单解决方案非常脆弱,因为它不能处理所有可能的故障情况(例如代理),因此不应该在生产环境中使用,不幸的是它有变得相当多产,所以任何要求同步 QNAM 的人都会被“异步使用它[愚蠢]”或这段最终会失败的简单代码难住。

我还没有找到 Qt 团队自己制定的“适当”解决方案,但是 codeproject 上的这个人已经足够体面,可以制作一个更全面的包装器,应该更安全:http://www.codeproject.com/Articles/484905/Use-QNetworkAccessManager-for-synchronous-download

【讨论】:

我在 python、GUI​​ 和生产系统中很容易做到这一点,为什么事情(QNAM 的同步使用)在 Qt 中并不正式和容易? @RaidenCore ,也问同样的问题。和C++有关系吗? @RaidenCore ,与c++无关。这是 Qt 本身的一个(主要)缺点。没有好的理由无法进行适当的内联同步下载和预设的潜在超时等。这是试图为所有事情提供通用解决方案的事情之一,简单而明显的使用案件变成一场噩梦。 @RadenCore ,继续,你可以做的是调用一个外部程序来下载 Qt,例如,一个简单的 Python 脚本、wget 命令等。从字面上看,这个简单的任务没有必要这么难。 他们使同步 I/O 变得“困难”是有充分理由的,这仅仅是因为它在你不应该进行阻塞操作的设置中一直被滥用。看看 JS,他们甚至已经移除了同步 API,因为它受到了太多的滥用。 Qt 使使用事件循环和异步消息传递变得相当容易,但仍然应该有更多的帮助函数和/或一个很好的例子来说明如何在只需要一个简单的同步 I/O 的场景中执行此操作(其中在具有用户交互的大型应用程序中很少见)。

以上是关于Qt同步QNetworkAccessManager获取的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Qt/QNetworkAccessManager (C++) 实现 SFTP

QT 从 QWebView 的 QNetworkAccessManager 读取数据

QT中的QNetworkAccessManager可靠连接

使用 QNetworkAccessManager 的 Qt 控制台应用程序

Qt无法打开包含文件:'QNetworkAccessManager':没有这样的文件或目录

在 Qt 中使用 QNetworkAccessManager 的持久连接