C ++ベースのクラスの新しいインスタンスを作成するためにQWebViewにJavascriptを取得する方法?

StackOverflow https://stackoverflow.com/questions/943554

役に立ちましたか?

解決

は、私が考えられてきたワンむしろ醜いハックは、私はランダムな名前を持つウィンドウオブジェクトに返すようにしたいオブジェクトをドロップする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におけるに基づいているので、うまくいけば、これは、その後改善されるように、スクリプトのサポートを統一している!

他のヒント

あなたは* QObjectをするあなたのオブジェクトのポインタを割り当てて、それを返すことができます。

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

これは、Linux上のQt Webkitのポートに私のために取り組んでいる。

QObjectを*ではなく、MyObjectに*として新しいオブジェクトを返す試してみてください。あなただけのQtScriptで作業している場合は、定義するために qScriptRegisterMetaType に呼び出すことができます一部QScriptValues(又はQVariants)にMyObjectに* Sの変換を処理するためのコードが、QtWebKitで使用されるJavaScriptエンジンのために同等であるように思われない。

うるさく、これはWebKitのにあなたの内部オブジェクトモデルを暴露することはQObjectを* sのあなたのオブジェクトポインタを変換プロキシ機能の別のセットを持つ、または同じことを行うにはいくつかの種類のアダプタークラスのいずれかを使用して関与することを意味します。

この答えはポールの答えに基づいていますが、ビットが簡略化されています。動作確認済みとQt 5.3のために働きます。あなたは、オブジェクトをインスタンス化し、このオブジェクトにQObjectポインタを返すファクトリを必要としています。オブジェクトのクラスは、それがJavaScriptで正常に動作するようにQObjectから継承する必要があります:

QObject * MyApp::createInstance(QString objname) {
    MyClass * obj = new MyClass(this);
    m_mainWindow->webView->page()->mainFrame()->addToJavaScriptWindowObject(objname, obj, QWebFrame::ScriptOwnership);
    return obj;
}

これにより、あなたはJavaScriptから次の操作を行うことができます:

var myobject = MyApp.createInstance("obj1");

(彼らが次の作品の両方をやって、ただのポインタであるこの時点で、あなたはobj1いるだけでなく、グローバルJavaScript名前空間にmyobject

myobject.testmethod();
obj1.testmethod();

この時点では、JavaScriptスロットにC ++の信号を接続するためにJavaScriptでconnectを使用することができます。ここでは、この技術に関するさらに詳しい情報: http://doc.qt.io/qt- 5 / qtwebkit-bridge.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top