2015-11-20 86 views
0

使用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。如何使用QML QtWebView来调用C++?

但问题是,我的Minibrowser中的Javascript函数如何在后端调用C++函数来执行更强大的功能?当我使用QWebView小部件时,我能够使用C++ webkit bridge,它允许我将DOM注入到C++对象中,因此可以调用我的C++代码。我没有看到任何有关如何使用QtWebView的基于QML的Minibrowser示例进行记录的技术。什么技术?

编辑:哦,并澄清,我不打电话远程网页与此,通过网络服务器。我只是通过file://来调用东西。换句话说,我使用了丰富的webkit界面,为我提供了一个超强大的图形用户界面,超越了Qt窗口小部件和QML可以提供给我的东西。

回答

0

我找到了答案。基本上,在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页面元素,复选框和单选按钮看起来非常时髦,而且弹下选择列表框停止工作。

  • 当你双击一个页面时,它会放大它。

+0

@MrEricSir我想你可能会感到困惑。我指的是QtWebView记录不好,而不是QWebView。 QtWebView随附5.5,仅利用本机webkit API,仅在Android,iOS和OSX上发布,但不支持Windows或Linux。另一方面,QWebView随附5.5,但带有一个旧版(但仍然可用)的webkit版本。 – Volomike

+0

@MrEricSir另外,似乎5.5中的QtWebView还不能用 - 正如我在上面解释的那样,东西会中断。所以,现在只能使用QWebView,它只能在5.5下工作,但不会超过5.5,然后再迁移到QtWebEngine。然而,关于QtWebEngine的坏消息是,它会使用Chromium而不是Webkit--这是一个胖的安装 - 而且很可能不会让你在Apple Store中获得批准。 – Volomike

+0

我试过并失败,错误消息:''QtWebKit.experimental“没有安装'。为什么发生这种情况?我在Windows上使用Qt 5.7.0。 –