如何使用QML QtWebView来调用C ++?

时间:2015-11-20 00:56:27

标签: javascript c++ qt qwebview qtwebview

使用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为我提供的功能。

1 个答案:

答案 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页面元素上启用它们,则滚动条会消失,复选框和单选按钮看起来非常时髦,并且弹出选择列表框停止工作。

  • 双击页面时,会缩放页面。