我找到了答案。基本上,在Qt5.5中,我正在用QtWebView潜入实验用地。班级方法在很大程度上是无证的,将来可能会改变。
现在,唯一的技术是消息传递,而不是像在QWebView C++ Bridge中可以使用的本机C++类方法调用。 QWebView C++ Bridge仅适用于QWebView小部件,而不适用于QtWebView QML。所以,你将这个消息传递给navigator.qt.postMessage()
API从你的Javascript到你的QML,然后QML可以调用C++。为了获得额外的功能,您需要执行几个步骤。这里有一个例子:
Invoke C++ method from webviews Javascript
这是博客这里一点:
http://rschroll.github.io/beru/2013/08/21/qtwebview.experimental.html
正如你看到的例子,你要这些进口添加到您的主。QML:
import QtWebKit 3.0
import QtWebKit.experimental 1.0
然后,在你WebView{}
部分,你必须加入这一行:
experimental.preferences.navigatorQtObjectEnabled: true
在这一点上,你可以打电话navigator.qt.postMessage("call foo in C++");
将消息发送给QML,你可以再拿起你的WebView{}
节里面:
experimental.onMessageReceived: { ...do something here in the QML... }
你的QML则可以传递一个消息马上回的Javascript:
experimental.postMessage("okay, I called foo in C++")
然后在你的Javascript,你可以添加一个事件监听器,如下:
navigator.qt.onmessage = function(ev) {
$('BODY').prepend(ev.data); // since console.log() is not possible
}
至于如何让你的QML调用C++,这里有一个例子:
https://stackoverflow.com/a/17881019/105539
编辑:在Qt 5.5中进行了更多的QtWebView实验后,它在以下几个方面显得相当脆弱。 我不推荐在5.5中使用它 - 它尚未准备好用于黄金时段。在Qt 5.5中,现在最好使用QWebView小部件,然后在下一个版本的Qt发布时迁移到QtWebEngine(Qt 5.6,5.7?)。
默认情况下,它会给你一个你可能不想要的右键快捷菜单。有趣的是,如果您导入实验库,然后在QML中设置此属性,则可以将其关闭:experimental.preferences.navigatorQtObjectEnabled: true
。
默认情况下,除非启用experimental.preferences.navigatorQtObjectEnabled: true
,否则默认情况下,HTML5 postMessage()API(原生HTML5)不起作用。
启用experimental.preferences.navigatorQtObjectEnabled: true
,滚动条消失,如果你使他们在某些HTML页面元素,复选框和单选按钮看起来非常时髦,而且弹下选择列表框停止工作。
当你双击一个页面时,它会放大它。
@MrEricSir我想你可能会感到困惑。我指的是QtWebView记录不好,而不是QWebView。 QtWebView随附5.5,仅利用本机webkit API,仅在Android,iOS和OSX上发布,但不支持Windows或Linux。另一方面,QWebView随附5.5,但带有一个旧版(但仍然可用)的webkit版本。 – Volomike
@MrEricSir另外,似乎5.5中的QtWebView还不能用 - 正如我在上面解释的那样,东西会中断。所以,现在只能使用QWebView,它只能在5.5下工作,但不会超过5.5,然后再迁移到QtWebEngine。然而,关于QtWebEngine的坏消息是,它会使用Chromium而不是Webkit--这是一个胖的安装 - 而且很可能不会让你在Apple Store中获得批准。 – Volomike
我试过并失败,错误消息:''QtWebKit.experimental“没有安装'。为什么发生这种情况?我在Windows上使用Qt 5.7.0。 –