Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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 从Webkit IFRAME(本地页面)访问QtQWebView桥的技巧 我的Qt C++(Qt 5.5)应用程序使用QWebVIEW控件。经过大量的混乱和辛勤工作,我设法让QtWebKIT桥技术工作,现在我的WebKIT文档(本地页面,没有Web服务器)能够调用C++函数。为您提供的资源包括:_Javascript_C++_Html_Qt_Iframe - Fatal编程技术网

Javascript 从Webkit IFRAME(本地页面)访问QtQWebView桥的技巧 我的Qt C++(Qt 5.5)应用程序使用QWebVIEW控件。经过大量的混乱和辛勤工作,我设法让QtWebKIT桥技术工作,现在我的WebKIT文档(本地页面,没有Web服务器)能够调用C++函数。为您提供的资源包括:

Javascript 从Webkit IFRAME(本地页面)访问QtQWebView桥的技巧 我的Qt C++(Qt 5.5)应用程序使用QWebVIEW控件。经过大量的混乱和辛勤工作,我设法让QtWebKIT桥技术工作,现在我的WebKIT文档(本地页面,没有Web服务器)能够调用C++函数。为您提供的资源包括:,javascript,c++,html,qt,iframe,Javascript,C++,Html,Qt,Iframe,然而,现在我在页面中引入了一个IFRAME,因此有了一个子文档。麻烦的是,我不能让子文档连接到C++桥。 当使用本地文件而不是web服务器时,在子文档和父文档之间进行Javascript通信时,Webkit似乎有很多安全控制。在我无意中发现使用HTML5的postMessage()。在这一点上,我可以建立通信,但这是通过消息而不是本机Javascript函数调用实现的 在Qt中有一种技术,我可以在C++和在QWebVIEW控件内的iFrAME中加载的文档之间建立一个桥梁,而不使用HTML5>代码

然而,现在我在页面中引入了一个IFRAME,因此有了一个子文档。麻烦的是,我不能让子文档连接到C++桥。

当使用本地文件而不是web服务器时,在子文档和父文档之间进行Javascript通信时,Webkit似乎有很多安全控制。在我无意中发现使用HTML5的
postMessage()。在这一点上,我可以建立通信,但这是通过消息而不是本机Javascript函数调用实现的

<>在Qt中有一种技术,我可以在C++和在QWebVIEW控件内的iFrAME中加载的文档之间建立一个桥梁,而不使用HTML5>代码>邮政消息()/Case> API? 请注意,我能够做的一件事是在代码中访问IFRAME,如下所示,但是
cpp
对象从未在IFRAME的Javascript中出现,即使我从jQuery以
$(document).ready(function(){setTimeout('testifcppload();',100);})的形式加载它


有三种不同的折衷方法:

选项A

HTML5支持
postMessage()
API将消息从子IFRAME文档传输到父文档,它甚至可以用于本地页面(如file://)。这稍微慢一点,因为这是一种间接的消息传递和解释技术

选项B

与Chrome浏览器不同,Qt版本的WebKit在使用文件://访问的页面上具有安全控件,如果父文档包含函数
foo()
,则可以调用
window.parent.foo()
。从那里,您可以调用cpp对象来执行任务。这有点间接,但不像
postMessage()
API那样间接

选项C

如果父文档有一个对象,叫做“代码> CPP < /Cube >(您创建的C++注入对象,作为例子),Qt的WebKIT版本将调用<代码> var CPP=WORL.Po.CPP;<代码>以便IFRAME能够访问cpp

我还有一个额外的建议,如果您在通过Qt部署之前在Chrome中测试WebKit接口,您可以使用
if(window.parent.cpp)
(iframe文档)和
if(cpp)
(父文档)来确定这是通过Qt还是Chrome加载的,然后,如果是通过Chrome加载的,通过JavaScript文件(比如一种填充)来伪造一个结果,这样你的Chrome GUI测试就可以正常工作,直到你准备好把它绑定到C++中。
void MainWindow::on_webView_loadFinished(bool arg1)
{
  if (arg1 == true) {
    QWebFrame *iframe = ui->webView->page()->mainFrame()->findFirstElement("iframe").webFrame();
    if (iframe) {
      connect(iframe,&QWebFrame::javaScriptWindowObjectCleared,this,&MainWindow::attachJavascript);
    }
  }
}

void MainWindow::attachJavascript()
{
  QWebFrame *frame = ui->webView->page()->mainFrame();
  QWebFrame *iframe = ui->webView->page()->mainFrame()->findFirstElement("iframe").webFrame();
  frame->addToJavaScriptWindowObject(QString("cpp"), this);
  if (iframe) {
    iframe->addToJavaScriptWindowObject(QString("cpp"),this);
  }
}

void MainWindow::on_webView_urlChanged(const QUrl &arg1)
{
  QWebFrame *frame = ui->webView->page()->mainFrame();
  QWebFrame *iframe = ui->webView->page()->mainFrame()->findFirstElement("iframe").webFrame();
  connect(frame, &QWebFrame::javaScriptWindowObjectCleared, this, &MainWindow::attachJavascript);
  if (iframe) {
    connect(iframe,&QWebFrame::javaScriptWindowObjectCleared, this, &MainWindow::attachJavascript);
  }
}