Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用qmlqtwebview调用C++;?_Javascript_C++_Qt_Qwebview_Qtwebview - Fatal编程技术网

Javascript 如何使用qmlqtwebview调用C++;?

Javascript 如何使用qmlqtwebview调用C++;?,javascript,c++,qt,qwebview,qtwebview,Javascript,C++,Qt,Qwebview,Qtwebview,在Qt5.5中,使用他们提供的,它使用了不同于的东西。相反,它使用QML和a。当您查看Javascript的navigator.appVersion时,它让您知道QWebView加载了一个定制的AppleWebKit/538.1(与Qt5.5一起提供),而QtWebView(注意区别)加载了本机核心操作系统AppleWebKit/601.1.56。这一点得到了证实,因为当我在OSX(El Capitan版本)上加载Safari时,它会显示601.1.56 问题是,我的JavaScript函数如何

在Qt5.5中,使用他们提供的,它使用了不同于的东西。相反,它使用QML和a。当您查看Javascript的
navigator.appVersion
时,它让您知道QWebView加载了一个定制的AppleWebKit/538.1(与Qt5.5一起提供),而QtWebView(注意区别)加载了本机核心操作系统AppleWebKit/601.1.56。这一点得到了证实,因为当我在OSX(El Capitan版本)上加载Safari时,它会显示601.1.56

问题是,我的JavaScript函数如何在MixBueld调用后端的C++函数来做更强大的东西?当我使用QWebVIEW控件时,我可以使用让我注入DOM的C++对象,因此可以调用我的C++代码。我没有看到任何关于如何使用QtWebView的基于QML的Minibrowser示例实现这一点的技术文档。技术是什么


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

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

<>现在,唯一的技术是消息传递,而不是像您可以在其中使用的本机C++类方法调用。QWebVIEW C++桥只与QWebVIEW小部件工作,而不是QtWebVIEW QML。因此,您可以通过代码从>代码>导航器.qt .PasMeMeAGE()/<代码> API从您的JavaScript到QML,然后QML可以调用C++。为了获得额外的功能,您需要执行几个步骤。下面是一个例子:

这里有一点博客:

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

import QtWebKit 3.0
import QtWebKit.experimental 1.0
然后,在
WebView{}
部分,您必须添加以下行:

experimental.preferences.navigatorQtObjectEnabled: true
此时,您可以调用
navigator.qt.postMessage(“在C++中调用foo”)
向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++,这里有个例子:

编辑:在Qt5.5中使用QtWebView进行了更多实验后,它在以下方面显得相当脆弱我不建议在5.5中使用它——它还没有准备好进入黄金时段。在Qt5.5中,最好现在使用QWebView小部件,然后迁移到下一个Qt版本(Qt5.6、5.7?)时使用

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

  • 默认情况下,除非启用
    experimental.preferences.navigatorQtObjectEnabled:true
    ,否则HTML5 postMessage()API(HTML5自带的API)似乎不起作用

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

  • 双击页面时,它会将其缩放


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

      <>现在,唯一的技术是消息传递,而不是像您可以在其中使用的本机C++类方法调用。QWebVIEW C++桥只与QWebVIEW小部件工作,而不是QtWebVIEW QML。因此,您可以通过代码从>代码>导航器.qt .PasMeMeAGE()/<代码> API从您的JavaScript到QML,然后QML可以调用C++。为了获得额外的功能,您需要执行几个步骤。下面是一个例子:

      这里有一点博客:

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

      import QtWebKit 3.0
      import QtWebKit.experimental 1.0
      
      然后,在
      WebView{}
      部分,您必须添加以下行:

      experimental.preferences.navigatorQtObjectEnabled: true
      
      此时,您可以调用
      navigator.qt.postMessage(“在C++中调用foo”)
      向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++,这里有个例子:

      编辑:在Qt5.5中使用QtWebView进行了更多实验后,它在以下方面显得相当脆弱我不建议在5.5中使用它——它还没有准备好进入黄金时段。在Qt5.5中,最好现在使用QWebView小部件,然后迁移到下一个Qt版本(Qt5.6、5.7?)时使用

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

      • 默认情况下,除非启用
        experimental.preferences.navigatorQtObjectEnabled:true
        ,否则HTML5 postMessage()API(HTML5自带的API)似乎不起作用

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

      • 当你双击一个页面时,它会自动关闭