您需要以异步方式对其进行编码。 C++ 11和Qt开始救援。请记住,lambda的主体将在事件循环中稍后执行。
QScopedPointer<QNetworkAccessManager> manager(new QNetworkAccessManager);
QNetworkReply * response = manager->get(QNetworkRequest(QUrl(url)));
QObject::connect(manager, &QNetworkAccessManager::finished, [manager, response]{
response->deleteLater();
manager->deleteLater();
if (reponse->error() != QNetworkReply::NoError) return;
QString contentType =
response->header(QNetworkRequest::ContentTypeHeader).toString();
if (!contentType.contains("charset=utf-8")) {
qWarning() << "Content charsets other than utf-8 are not implemented yet.";
return;
}
QString html = QString::fromUtf8(response->readAll());
// do something with the data
}) && manager.take();
除非你只使用该代码一次,你应该把QNetworkManager
实例作为控制器类的成员,或者在main
等
这是不好的建议,因为你编写异步代码就好像它是同步的。事实并非如此。如果你没有忘记实际上是'exec()'事件循环,那么你会暴露提交者对'event.exec()'的潜在后果,可能会重新输入这个方法或其他任何方法。由于大多数人并没有在设计时考虑到这些复杂因素,所以我认为它是未定义行为的来源,可能会格式化硬盘驱动器或发起核攻击。显式异步编码在C++ 11和Qt 5的帮助下是一个更和平的选择。 –
那么提交者试图通过同步代码获取HTML,这就是为什么我向他展示这个解决方案。有时候这样做更容易。并感谢您指出我的event.exec()错误。 – MKAROL
是的,我同意将未定义的行为引入您的应用程序很容易。这并不意味着你应该这样做。即使在Qt 4中,Qt也使得异步编码变得相对容易。因为使用C++ 11和Qt 5,建议旋转本地事件循环和类似的疯狂并不存在任何借口。 –