2010-04-26 80 views
6

有什么方法可以将Qt中的QtWebKit浏览器中运行的JavaScript对象/函数暴露给JavaScript吗?可以将ActionScript对象暴露给Adobe AIR中的WebKit浏览器内运行的JS代码 - 我正在寻找Qt中的类似功能。在Qt中将C++对象暴露给Javascript

回答

2

是的。看看this.这应该是一个好的开始。

+0

感谢您的信息! – BlueSilver 2010-04-30 08:19:40

4

编辑:链接工作,但以防万一链接由理查德·穆尔 AGAIN [Link]游...

一个问题我见过拿出数倍于#qt和QT-兴趣如何 将自定义(特定于应用程序)的API添加到默认情况下在 QtWebKit中可用的API。这实际上很简单(一旦你知道如何),因为我会在下面显示 。这篇文章将展示一个简单的例子,介绍如何从javascript创建一个对象 ,包括调用对象的方法并返回C++中的值 。

有你真的需要为了执行这个 集成知道两件事情,第一是 QWebFrame的addToJavaScriptWindowObject()方法,这允许将指定的QObject从 的JavaScript可见。您需要知道的第二件事是,以这种方式发布在 中的对象每次清除javascript窗口对象时都会消失 - 即 即。每次用户导航到新页面时。为了防止这种问题导致 问题,QWebFrame提供一个信号,告诉你何时清除对象 ,允许您重新添加自定义API。这实际上比起听起来要简单得多 !

这样做的核心是在例如两个方法真正落实,他们 如下图所示:

void MyApi::setWebView(QWebView *view) 
{ 
    QWebPage *page = view->page(); 
    frame = page->mainFrame(); 

    attachObject(); 
    connect(frame, SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(attachObject())); 
} 

void MyApi::attachObject() 
{ 
    frame->addToJavaScriptWindowObject(QString("MyApi"), this); 
} 

此代码是所有你需要为了让所有的公共插槽的 MyApi对象对javascript可见。该MyApi类提供了两个公共插槽:(!是的,插槽可以返回的东西)

public slots: 
    void doSomething(const QString &param); 
    int doSums(int a, int b); 

第一个插槽只是消息记录到调试输出,第二个返回 它的两个参数的总和。他们被称为 从JavaScript这样的:

MyApi.doSomething('Hello from JS page 2!!!!'); 

    sum = MyApi.doSums(2, 3); 
    alert('C++ says the sum is ' + sum); 

而这一切就是这么简单!您可以从>http://xmelegance.org/devel/qtwebkitextension.tar.gz下载代码。

+0

不幸的是,这个例子在QT5中不起作用。有任何更新的机会,或者我应该再打开一个问题吗? – Alex 2015-05-11 20:41:36