我正在使用 QML Webview。它似乎适用于 intel.com、apple.com、cnn.com、foxnews.com 等网站,但是如果我尝试加载 gmail.com 或 hotmail.com,它似乎只加载以下 html:
<html><head></head><body></body></html>
==== load finished
这被我在 onLoadFinished 事件中的调试消息转储。
这是我设置 Webview 的方法:
WebView {
id: webView
focus: true
preferredWidth: webkit.width
preferredHeight: webkit.height
settings.autoLoadImages: true
settings.javascriptEnabled: true
settings.javascriptCanOpenWindows: true
settings.minimumFontSize: 12
settings.defaultFontSize: webkit.fontsize
url: ""
onLoadFinished: {
console.debug(webView.html);
console.debug("==== load finished");
}
}
(其他事件未显示)
任何人都知道我可能做错了什么?如果我错过了一个我不知道的设置,因为关于“设置”的文档很少(除非它很明显)。我们使用的是 4.7.1,但我确实尝试了 4.8.2,结果相同。
谢谢
[编辑] 一位同事建议这可能是用户代理问题。我看过很多关于修改 QWebView 的 C++ 版本的文章,但我看不出它是如何从 QML 方面做的,除非我直接破解 Qt 源代码。有人认为这可能是问题吗?我会怀疑它,因为 gmail.com 在我桌面上的其他网络浏览器中运行良好(ubuntu 11.10)
[编辑] 我在 Qt 4.7.1 中编译了“浏览器”示例,它在那里也不起作用。Qt 前几天发布了 4.8.3,当我在那里编译“浏览器”时,它(浏览器)工作了。我注意到 gmail.com 从 http: 更改为 https: 所以我想可能是因为我们使用 -no-openssl 编译 QT。我尝试使用 openssl 编译 4.7.1 和 4.8.3,但我的 QML 问题没有运气。
[半解决] 结果是它糟糕的 QT 文档(对于初学者)。QML Webview 没有在他们的文档中告诉您您需要安装自己的 NetworkAccessManagerFactory。DeclarativeView 有一个 engine()(至少在 4.7.1 中),您可以在其中使用自己的工厂调用 setNetworkAccessManagerFactory()。现在我这样做了,它可以在我的桌面上运行,但不能在我们的嵌入式 linux 设备上运行。虽然下载 gmail.com 并没有“锁定”10%,但它现在失败了。我还必须用 openssl 编译 Qt,但是它正在加载我的 openssl 库(ssl 和加密),但还不能在嵌入式设备上运行。很奇怪。
[已解决] 很奇怪,但似乎我没有实现 QNetworkAccessManager::sslErrors(QNetworkReply *, QList)) 信号。这对桌面没有影响,但是当我使用嵌入式设备时它不起作用,现在它起作用了。