1

在 Qt 5.5 中,使用他们提供的Minibrowser 示例,它使用了不同于QWebView widget的东西。相反,它使用 QML 和QtWebView 模块。当您查看 Javascript 时navigator.appVersion,它会让您知道 QWebView 加载自定义 AppleWebKit/538.1(Qt5.5 附带的东西),而 QtWebView(注意区别)加载本机核心 OS AppleWebKit/601.1.56。这得到了证实,因为当我在我的 OSX(El Capitan 版本)上加载 Safari 时,它显示 601.1.56。

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

编辑:哦,澄清一下,我不是通过网络服务器调用远程网页。我只是通过 file:// 调用东西。换句话说,我使用丰富的 webkit 界面为我提供了一个超强大的 GUI,它远远超出了 Qt 小部件和 QML 可以为我提供的功能。

4

1 回答 1

0

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

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

从 webviews Javascript 调用 C++ 方法

这是在这里写的一点博客:

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 小部件,然后在 Qt 的下一个版本(Qt 5.6、5.7?)发布时迁移到QtWebEngine 。

  • 默认情况下,它会为您提供您可能不想要的右键单击上下文菜单。有趣的是,如果您导入实验库,然后在 QML 中设置此属性,则可以将其关闭:experimental.preferences.navigatorQtObjectEnabled: true.

  • 默认情况下,除非您启用experimental.preferences.navigatorQtObjectEnabled: true.

  • 当您启用experimental.preferences.navigatorQtObjectEnabled: true时,如果您在某些 HTML 页面元素上启用滚动条,它们就会消失,复选框和单选按钮看起来非常时髦,并且弹出选择列表框停止工作。

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

于 2015-11-20T02:31:42.870 回答