6

QtのQtWebKitブラウザー内で実行されているJavaScriptにC++オブジェクト/関数を公開する方法はありますか?AdobeAIRのWebKitブラウザー内で実行されているJSコードにActionScriptオブジェクトを公開することは可能です-Qtで同様の機能を探しています。

4

2 に答える 2

4

編集: リンクは機能していますが、リンクが再び壊れた場合に備えて[リンク] by Richard Moore ...

#qt と qt-interest で何度か出てきた質問の 1 つは、カスタム (アプリケーション固有の) API を QtWebKit でデフォルトで利用可能な API に追加する方法です。以下に示すように、これは実際には非常に簡単です (方法がわかれば)。この投稿では、オブジェクトのメソッドを呼び出して C++ から値を返すなど、JavaScript からオブジェクトを使用できるようにする方法の簡単な例を示します。

この統合を実行するために本当に知っておく必要があることが 2 つあります。1 つ目は、QWebFrame の addToJavaScriptWindowObject() メソッドです。これにより、指定された QObject が JavaScript から見えるようになります。次に知っておくべきことは、この方法で公開されたオブジェクトは、javascript ウィンドウ オブジェクトがクリアされるたびに消えるということです。ユーザーが新しいページに移動するたびに。これが問題を引き起こすのを防ぐために、QWebFrame は、オブジェクトがクリアされるたびに通知するシグナルを提供し、カスタム API を再度追加できるようにします。これは実際には、思ったよりもずっと簡単です。

この例では、このコアは実際には 2 つのメソッドで実装されています。以下に示します。

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 クラスは、次の 2 つのパブリック スロットを提供します。

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

最初のスロットは単にメッセージをデバッグ出力に記録し、2 番目のスロットは 2 つの引数の合計を返します (そうです、スロットは何かを返すことができます!)。それらは次のように 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からコードをダウンロードできます。

于 2013-12-19T15:03:45.180 に答える
2

はい。これを見てください 良いスタートになるはずです。

于 2010-04-26T12:47:38.720 に答える