C ++ベースのクラスの新しいインスタンスを作成するためにQWebViewにJavascriptを取得する方法?
-
09-09-2019 - |
質問
しかし、私が本当にやりたいことは、これらのスロットのいずれかが、新しいオブジェクトを返すようです。例えば、私はQObjectの派生クラスのインスタンスを返し、このようなスロットを有する
MyObject* MyApp::helloWorld()
{
//MyObject is dervied from QObject
return new MyObject();
}
私は正常にこのようなJavaScriptからこのスロットを呼び出すことができます。
var foo=myapp.helloWorld();
しかし、fooは空のように見える、私は任意のスロットを呼び出すか、いずれにもアクセスすることはできません JavaScriptからそれのプロパティます。
私はこれを達成する方法上の任意のアイデア?
解決
は、私が考えられてきたワンむしろ醜いハックは、私はランダムな名前を持つウィンドウオブジェクトに返すようにしたいオブジェクトをドロップする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のポートに私のために取り組んでいる。
QtScriptはプロトタイプの概念を持っています。我々はJavaScriptCoreにおけるとQtScriptを埋めることができます天気を私たちは調査しています - <全角>はにもWebKitのJavaScript環境からのプロトタイプを使用する可能性をもたらすべきです。 http://doc.trolltech.com/ 4.5 / qtscript.html#作り、使いのプロトタイプベースの継承
の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 の