- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的 Qt C++ (Qt 5.5) 应用程序使用 QWebView 小部件。经过大量的困惑和艰苦的工作,我设法让 QtWebKit Bridge 技术发挥作用,现在我的 Webkit 文档(本地页面,没有 Web 服务器)能够调用 C++ 函数。适合您的资源是:
http://doc.qt.io/qt-5/qtwebkit-bridge.html
https://stackoverflow.com/a/4979636/105539
但是,现在我已经在页面中引入了一个 IFRAME,因此有了一个子文档。问题是,我无法让子文档连接到那个 C++ 桥。
当使用本地文件而不是 Web 服务器时,在子文档和父文档之间进行 Javascript 通信时,Webkit 似乎有很多安全控制。在我偶然发现使用 HTML5 的 postMessage()
API 的复杂性之前,所有通过 Javascript 进行的父子调用都无法正常工作。那时,我可以建立通信,但它是通过消息而不是本地 Javascript 函数调用。
Qt 中是否有一种技术可以在不使用 HTML5 postMessage()
API 的情况下在 C++ 和 QWebView 小部件内的 IFRAME 中加载的文档之间建立桥梁?
请注意,我能够做的一件事是在如下代码中访问 IFRAME,但 cpp
对象从未出现在 iframe 的 Javascript 中,即使我从 jQuery 加载它也是如此作为 $(document).ready(function(){ setTimeout('testIfCPPLoaded();',100); });
.
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);
}
}
最佳答案
存在三种不同的妥协技术:
选项A
HTML5 支持 postMessage()
将消息从子 IFRAME 文档传输到其父文档的 API,它甚至适用于本地页面(如 file://)。这有点慢,因为它是一种间接的消息传递和解释技术。
选项 B
与 Chrome 浏览器对通过 file://访问的页面进行安全控制不同,Qt 版本的 WebKit 允许您调用 window.parent.foo()
如果父文档包含函数 foo()
.从那里,您可以调用 cpp 对象来执行任务。这有点间接,但不像 postMessage()
那样间接。 API。
选项 C
如果父文档有一个名为 cpp
的对象(例如,您创建的 C++ 注入(inject)对象),Qt 版本的 WebKit 将允许您调用 var cpp = window.parent.cpp;
以便 IFRAME 能够访问 cpp。
我还有一个额外的建议是,如果您在通过 Qt 部署之前在 Chrome 中测试 WebKit 界面,您可以使用 if (window.parent.cpp)
(iframe 文档)和一个 if (cpp)
(父文档)以确定这是通过 Qt 还是 Chrome 加载,然后,如果通过 Chrome 加载,则通过 Javascript 文件(如一种 polyfill)伪造结果,这样您的 Chrome GUI 测试就可以正常工作,直到您准备好将它连接到 Qt 中的 C++。
关于javascript - 使 Qt QWebView Bridge 可从 Webkit IFRAME(本地页面)访问的技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33599474/
如果我需要检测 Firefox,我使用了以下代码: var firefox = !(window.mozInnerScreenX == null); 我很好奇是否有类似的东西可以在不检查用户代理字符串
我正在开发我的第一个Windows窗体应用程序以使用WebKit.Net。我需要连接到https站点并弹出身份验证表单。使用.Net内置的浏览器,身份验证表单会自动弹出,但是WebKit只是将我放到4
就像您可以将 -webkit-gradient 添加到 -webkit-box-reflect 一样,您可以对反射执行转换吗?我正在反射的图像有一个 Angular ,我想尝试旋转反射或稍微倾斜它以使
我有一个加载一些网页的 QWebView,但是当鼠标被按下并拖动时的问题是它选择了所有阻碍它的东西。 有什么办法可以摆脱这个吗??我不想选择文本和其他项目。, 如果我限制 mouseMove 和 mo
我对编程和创建程序真的很陌生。最近我在浏览 iTunes 文件夹时看到了一个 .css 文件。我打开它,看到很多 -webkit 样式来设置界面样式。 我可以使用 webkit 来设置 C++、.NE
这个问题在这里已经有了答案: How do I fix inconsistent Textarea bottom margin in Firefox and Chrome? (4 个回答) 4年前关闭
我希望自定义webkit-scrollbar为悬停状态设置不同的背景颜色动画。下面的代码在悬停时更改颜色,但不设置任何动画。它可以在div上运行,所以我怀疑webkit-scrollbar在过渡时效果
我正在尝试评估 WebKit 补丁的可能性,该补丁将允许所有渲染的图形渲染到完全透明的背景上。 想要的效果是呈现完全没有任何背景的 Web 内容,它应该看起来漂浮在桌面上(或浏览器窗口后面显示的任何内
这是 HTML 代码: A B C 这是 CSS 代码: .row { line-height:0;} .item { line-hei
我经常看到这样的 css 动画代码: @-webkit-keyframes anim{ 0{ -webkit-transform: perspective(400px) rotate3d(
我想为元素的 -webkit-transform: rotateX() 设置动画,同时允许元素保持其 -webkit-transform: rotate() 属性不变。考虑以下代码: @-webkit
CSS3 规则带来了许多有趣的特性。 取border-radius , 例如。该标准规定,如果您编写此规则: div.rounded-corners { border-radius: 5px; }
我在想: 有没有人考虑过为嵌入式 Javafx 2.0 Webkit 浏览器或新的 QT5 - Webkit 实现 webdriver-interface。 有人对朝着这个方向发展的一些 Github
我正在尝试使用 WebKit 创建 Vala 程序。这是我编译它的方式: valac --pkg gtk+-3.0 --pkg granite --pkg glib-2.0 --pkg webkitg
我刚刚开始使用 webkit,我想先自己执行构建。我对如何使用 nightly sources of webkit 进行编译有点困惑。主 webkit 站点上的构建说明说要使用整个 SVN 树来执行完
我在做一些我认为很简单的事情时遇到了问题。读取输入字段的值,然后将该值写入文本文件。我得到它的工作,但只是部分和不一致。发生的情况是,文本 a) 被截断(并非所有在该字段中输入的数据都写入文件)和 b
我在使用 -webkit-animation 时遇到内存问题。 原则 我想为渐变背景制作动画。由于它们在关键帧中不可设置动画,我将每个背景放在不同的 div 中,并且我正在使用那些 div 不透明度和
困境: 在我的 CSS 文件中,我有这个: div { -webkit-transform: scale(0.5); } 在我的 jQuery 中,我稍后会这样做: $('div).css('
我正在尝试构建网络爬虫。 我需要两件事: 将 HTML 转换为 DOM 对象。 按需执行现有的 JavaScript。我期望的结果是一个 DOM 对象,其中执行加载的 JavaScript 已经执行。
似乎在元素上应用 webkit-transform 属性,或者它的父元素具有 webkit-over-flowing-scrolling: touch 完全打破了滚动中的滚动根本不起作用。 有没有人遇
我是一名优秀的程序员,十分优秀!