使用Qt 5.5,使用他们提供的Minibrowser example,它使用的内容与QWebView widget不同。相反,它使用QML和QtWebView module。当您查看Javascript的navigator.appVersion
时,它会让您知道QWebView加载自定义AppleWebKit / 538.1(Qt5.5附带的东西),而QtWebView(注意区别)加载本机核心操作系统AppleWebKit / 601.1.56 。这是确认的,因为当我在我的OSX(El Capitan版本)上加载Safari时,它显示为601.1.56。
然而,问题是我的Minibrowser中的Javascript函数如何调用后端的C ++函数来执行更强大的功能?当我使用QWebView小部件时,我能够使用C++ webkit bridge让我向DOM注入我的C ++对象,因此可以调用我的C ++代码。我没有看到有关如何使用QtWebView的基于QML的Minibrowser示例执行此操作的任何技术。技术是什么?
编辑:哦,澄清一点,我不会通过网络服务器调用远程网页。我只是通过file://调用东西。换句话说,我正在使用丰富的webkit界面给我一个超级强大的GUI,它超越了Qt小部件和QML为我提供的功能。答案 0 :(得分:0)
我找到了答案。基本上,在Qt5.5中,我正在使用QtWebView潜入实验区。类方法在很大程度上没有记录,将来可能会改变。
目前,唯一的技术是消息传递,而不是您可以在QWebView C++ Bridge中使用的本机C ++类方法调用。 QWebView C ++ Bridge仅适用于QWebView小部件,而不适用于QtWebView QML。因此,您使用Javascript中的navigator.qt.postMessage()
API将此消息传递给QML,然后QML可以调用C ++。为了获得额外的功能,您需要执行几个步骤。这是一个例子:
Invoke C++ method from webviews Javascript
这里有一点博客:
http://rschroll.github.io/beru/2013/08/21/qtwebview.experimental.html
从示例中可以看出,您必须将这些导入添加到main.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小部件,然后在下一个时移植到QtWebEngine Qt的版本出来了(Qt 5.6,5.7?)。
默认情况下,它会为您提供您可能不需要的右键单击上下文菜单。有趣的是,如果您导入实验库,然后在QML中设置此属性,则可以将其关闭:experimental.preferences.navigatorQtObjectEnabled: true
。
默认情况下,除非您启用experimental.preferences.navigatorQtObjectEnabled: true
,否则HTML5 postMessage()API(HTML5原生的API)似乎无效。
当您启用experimental.preferences.navigatorQtObjectEnabled: true
时,如果您在某些HTML页面元素上启用它们,则滚动条会消失,复选框和单选按钮看起来非常时髦,并且弹出选择列表框停止工作。
双击页面时,会缩放页面。