有什么方法可以将 C++ 对象/函数公开给在 Qt 的 QtWebKit 浏览器中运行的 JavaScript?可以将 ActionScript 对象公开给在 Adobe AIR 的 WebKit 浏览器中运行的 JS 代码——我正在 Qt 中寻找类似的功能。
2 回答
编辑:链接正在工作,但以防万一链接再次断开[链接]理查德·摩尔 ...
我在#qt 和 qt-interest 上多次看到的一个问题是如何将自定义(特定于应用程序的)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 ¶m );
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下载代码。
是的。看看这个。 这应该是一个好的开始。