首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用QML QtWebView调用C++?

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

Stack Overflow用户
提问于 2015-11-20 00:56:26
回答 1查看 1.4K关注 0票数 1

使用QT5.5,使用他们提供的Minibrowser示例,它使用的是与QWebView小部件不同的东西。相反,它使用QML和QtWebView模块。当您查看Javascript的navigator.appVersion时,它会让您知道QWebView加载一个定制的AppleWebKit/538.1 (Qt5.5附带的东西),而QtWebView (请注意差异)加载本机核心操作系统AppleWebKit/601.1.56。这是肯定的,因为当我在我的OSX (El Capitan版本)上加载Safari时,它是601.1.56。

然而,问题是我的Javascript函数在Minibrowser中如何调用后端的C++函数来完成更强大的功能呢?当我使用QWebView小部件时,我能够使用C++ webkit桥,它允许我将C++ webkit桥注入到DOM C++对象中,从而可以调用我的C++代码。我没有看到任何关于如何使用使用QtWebView的基于QML的Minibrowser示例来实现此操作的技术。技术是什么?

编辑:哦,为了澄清,我不会用这个调用远程网页,通过一个web服务器。我只是通过file://.打电话换句话说,我正在使用丰富的webkit界面,为我提供一个超强大的GUI,这远远超出了Qt小部件和QML为我提供的功能。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-20 02:31:42

我找到了答案。基本上,在Qt5.5中,我正在使用QtWebView潜入实验领域。类方法在很大程度上没有文档化,将来可能会发生变化。

目前,唯一的技术是消息传递,而不是本地C++类方法调用,就像您可以在QWebView C++桥中使用的那样。QWebView C++桥仅适用于QWebView小部件,而不是QtWebView QML。因此,您可以使用navigator.qt.postMessage() API将消息从Javascript传递到QML,然后QML可以调用C++。为了获得额外的功能,您需要执行几个步骤。下面是一个例子:

从webviews调用C++方法

我在这里写了一点:

http://rschroll.github.io/beru/2013/08/21/qtwebview.experimental.html

从示例中可以看到,您必须将这些导入添加到您的main.qml中:

代码语言:javascript
复制
import QtWebKit 3.0
import QtWebKit.experimental 1.0

然后,在您的WebView{}部分中,您必须添加以下一行:

代码语言:javascript
复制
experimental.preferences.navigatorQtObjectEnabled: true

此时,您可以调用navigator.qt.postMessage("call foo in C++");向QML发送消息,然后您可以在WebView{}部分中使用以下内容来获取该消息:

代码语言:javascript
复制
experimental.onMessageReceived: { ...do something here in the QML... }

然后,QML可以将一条消息传递回Javascript,其中包括:

代码语言:javascript
复制
experimental.postMessage("okay, I called foo in C++")

然后在Javascript中添加一个事件侦听器,如下所示:

代码语言:javascript
复制
navigator.qt.onmessage = function(ev) {

  $('BODY').prepend(ev.data); // since console.log() is not possible

}

至于如何让QML调用C++,下面是一个示例:

https://stackoverflow.com/a/17881019/105539

编辑:在QT5.5中对QtWebView进行了更多的实验之后,它在以下几个方面显得相当古怪。 --我不建议在5.5中使用它--它还没有做好黄金时段的准备。在QT5.5中的,最好现在使用QWebView小部件,然后在下一个Qt版本发布时迁移到QtWebEngine (QT5.6,5.7?)。

  • 默认情况下,它会为您提供一个您可能不想要的右键上下文菜单。有趣的是,如果导入实验库,然后在QML:experimental.preferences.navigatorQtObjectEnabled: true中设置该属性,就可以关闭它。
  • 默认情况下,HTML5 postMessage() API (本机HTML5)似乎无法工作,除非您启用experimental.preferences.navigatorQtObjectEnabled: true
  • 启用experimental.preferences.navigatorQtObjectEnabled: true时,如果在某些HTML页面元素上启用滚动条,则滚动条将消失,复选框和单选按钮看起来非常时髦,弹出式选择列表框停止工作。
  • 当你双击一个页面时,它会放大它。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33817194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档