6

addToJavaScriptWindowObjectを使用してC++オブジェクトをQWebFrameに正常に追加し、javascriptからそのオブジェクトのスロットを呼び出すことができます。

しかし、私が本当にやりたいのは、それらのスロットの1つに新しいオブジェクトを返すようにすることです。たとえば、QObject派生クラスインスタンスを返す次のようなスロットがあります。

   MyObject* MyApp::helloWorld()
   {
          //MyObject is dervied from QObject
          return new MyObject();
   }

このようにJavaScriptからこのスロットを正常に呼び出すことができます

   var foo=myapp.helloWorld();

しかし、fooは空のようです。Javascriptからスロットを呼び出したり、スロットのプロパティにアクセスしたりすることはできません。

これをどのように達成できるかについてのアイデアはありますか?

4

5 に答える 5

3

私が考えたかなり醜いハックの1つは、addToJavaScriptWindowObjectを使用して、戻りたいオブジェクトをランダムな名前でウィンドウオブジェクトにドロップし、代わりにスロットにオブジェクトインスタンスの名前を返すようにすることです。

QString MyApp::helloWorld()
{
     //general a unique name for the js variable
     QString name=getRandomVariableName();

     //here's the object we want to expose to js
     MyObject* pReturn=new MyObject();

     //we make attach our object to the js window object    
     getWebFrame()->addToJavaScriptWindowObject(name, pReturn,
         QScriptEngine::ScriptOwnership);  

     //tell js the name we used
     return name;
}

JSを記述して、戻り値が文字列であるかどうかを確認し、文字列である場合は、ウィンドウからオブジェクトを取得できます。

var foo=myapp.helloWorld();
if (typeof foo == "string")
{
    foo=window[foo];
}

少し醜いですが、より良い方法が来るまで私を助けてくれます。将来のQtバージョンでは、スクリプトサポートが統合され、すべてWebKitのJavaScriptCoreに基づいているため、これが改善されることを願っています。

于 2009-06-03T20:31:39.063 に答える
2

Object ポインターを QObject * に割り当てて、それを返すことができます。

    QObject * obj = new MyObject();
    return obj;

これは、Linux の Qt Webkit ポートで機能しています。

于 2011-06-03T07:22:42.127 に答える
1

QtScript にはプロトタイプの概念があり、スクリプト値の C++ プロトタイプを作成できます。QtScript と JavaScriptCore をブリッジできるかどうかを調査しています。これにより、WebKit の JavaScript 環境からのプロトタイプも使用できるようになるはずです。http://doc.trolltech.com/4.5/qtscript.html#make-use-of-prototype-based-inheritance

于 2009-06-04T14:51:04.950 に答える
1

新しいオブジェクトを MyObject* ではなく QObject* として返してみてください。QtScript だけを使用している場合は、qScriptRegisterMetaTypeを呼び出して、MyObject* から QScriptValues (または QVariants) への変換を処理するコードを定義できますが、QtWebKit で使用される JavaScript エンジンに相当するものはないようです。

厄介なことに、内部オブジェクト モデルを WebKit に公開するには、オブジェクト ポインターを QObject* に変換する別のプロキシ関数のセットを用意するか、何らかのアダプター クラスを使用して同じことを行う必要があります。

于 2009-06-11T15:55:56.357 に答える