您需要以異步方式對其進行編碼。 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,建議旋轉本地事件循環和類似的瘋狂並不存在任何藉口。 –