在 Qt 中将 C++ 对象公开给 Javascript

Posted

技术标签:

【中文标题】在 Qt 中将 C++ 对象公开给 Javascript【英文标题】:Expose C++ object to Javascript in Qt 【发布时间】:2010-04-26 12:16:29 【问题描述】:

有什么方法可以将 C++ 对象/函数公开给在 Qt 的 QtWebKit 浏览器中运行的 javascript?可以将 ActionScript 对象公开给在 Adob​​e AIR 的 WebKit 浏览器中运行的 JS 代码 - 我正在 Qt 中寻找类似的功能。

【问题讨论】:

【参考方案1】:

编辑:链接正在工作,但以防链接再次中断[Link] Richard Moore ...

我在#qt 和 qt-interest 上多次看到的一个问题是如何 将自定义(特定于应用程序的)API 添加到默认情况下可用的 API QtWebKit。正如我将展示的那样,这实际上很容易(一旦你知道如何) 以下。这篇文章将展示一个如何使对象可用的简单示例 来自 javascript,包括在对象上调用方法和返回值 来自 C++。

要执行此操作,您确实需要了解两件事 集成,首先是addToJavaScriptWindowObject()方法 QWebFrame,这将使指定的 QObject 可见 javascript。您需要知道的第二件事是发布的对象 每次清除 javascript 窗口对象时,这种方式都会消失 - IE。每次用户导航到新页面时。为了防止这种情况导致 问题,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下载代码。

【讨论】:

不幸的是,这个例子在 QT5 中不起作用。有机会更新还是我应该打开另一个问题?【参考方案2】:

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

【讨论】:

以上是关于在 Qt 中将 C++ 对象公开给 Javascript的主要内容,如果未能解决你的问题,请参考以下文章

Qt 5.0:向 Javascript 公开 C++ 方法

模型中的 Qt 模型?

如何在 Struts 2 中将对象公开给我的所有视图?

在网页中将 XPCOM 组件公开给 javascript

从 QML 简单访问 C++ 对象数据

在 Mono 中将 C++ 暴露给 C#:函数的无效转换?