Javascript 从Webkit IFRAME(本地页面)访问QtQWebView桥的技巧 我的Qt C++(Qt 5.5)应用程序使用QWebVIEW控件。经过大量的混乱和辛勤工作,我设法让QtWebKIT桥技术工作,现在我的WebKIT文档(本地页面,没有Web服务器)能够调用C++函数。为您提供的资源包括:
然而,现在我在页面中引入了一个IFRAME,因此有了一个子文档。麻烦的是,我不能让子文档连接到C++桥。 当使用本地文件而不是web服务器时,在子文档和父文档之间进行Javascript通信时,Webkit似乎有很多安全控制。在我无意中发现使用HTML5的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>代码
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);
}
}