2013-01-18 13 views
6

にC++メソッドを公開します。Qtの5.0:</p> <pre><code>Q_INVOKABLE MyObject* createMyObject(); </code></pre><p>MyObjectにはQObjectを由来である:私は以下のメソッドを持つJavaスクリプトのグローバルプロパティとしてオブジェクトを公開しようとしたJavaスクリプト

私はJavaスクリプトでこのメソッドを呼び出したとき、それは型のオブジェクトを返します。

QVariant(MyObject*) 

それは私がスクリプトの中で、さらにそれを使用することができるように自動的にQJSValueに変換することが可能です場合、私は思ったんだけど?

答えて

3

スクリプト内のMyObjectを参照する前に、以下のメソッドを呼び出すだけです。

qmlRegisterType<MyObject>("", 1, 0, "MyObject"); 

その後createMyObject方法は、任意の変換せずに正しい型を返します。

var obj = createMyObject(); 

MyObject 

実は私たちは

Q_INVOKABLE QObject* createMyObject(); 

Q_INVOKABLE MyObject* createMyObject(); 

以下の方法の種類を変更した場合

それは私が(... QJSEngineにQListにを公開しようとしているで立ち往生した瞬間に)スクリプトのためQJSEngineを使用しようと、似たような状況にいるにも

qmlRegisterType 
+0

QmlなしでJSエンジンを使用している場合は動作しません。 –

+0

意外にもそうです!私はqmlを使用せず、qmlRegisterTypeで動作し、qRegisterMetaTypeでは使用しません。 – Maxym

2

QJSEngine::newQObject()メソッドを使用できます。

使用newQObject()はQObject(またはサブクラス)のポインタをラップします。 newQObject()は、プロキシスクリプトオブジェクトを返します。プロパティ、子、およびQObjectの信号およびスロットは、プロキシオブジェクトのプロパティとして使用できます。それがQtメタオブジェクトシステムを使用して動的に行われるため、バインディングコードは必要ありません。

詳細はQJSEngine Class: QObject Integrationを参照してください。

+0

はい、わかります。しかし、戻り値をQJSValueに変換するには、クラス内のすべてのQ_INVOKABLEのラッパーが必要です。 – Maxym

4

Java ScriptはQVariantを不明なラッパーとして使用しているようです。値は簡単に渡すことができますが、そのプロパティのうちのどれも使用できず、そのメソッドのどれも呼び出せません。スクリプトで使用するには、QJSValueに変換する必要があります。私が見つけた唯一の方法は、次のようにヘルパー関数を宣言している:

Q_INVOKABLE QJSValue convert(QVariant var) 
{ 
    return _engine.newQObject(var.value<QObject*>()); 
} 

それはQJSValueにQVariantを変換することが可能です:

var obj = convert(createMyObject()); 

とOBJだから今タイプ

MyObject 

のものであろうそれはスクリプトで使用することができます。

+0

良い解決策。それに注意してください:)。 –

+0

その後、(qmlRegisterTypeを使用して)より正確な解が見つかりました。私の最近の答えを見てください。 – Maxym

0

せずに作業を開始します

私は既存のC++オブジェクトをスクリプティングに公開する最も簡単な方法は、次のようなものだと考えてください。

//create c++ file object 
MyObject* anObject = new MyObject(); 

//make c++ object available to script 
QJSValue scriptObject = myEngine.newQObject(anObject); 
myEngine.globalObject().setProperty("obj", scriptObject); 

スクリプトから「obj」にアクセスできるはずです。

ところで、あなたはどのようにスクリプト(QVariant(MyObject *))の型を見つけるのですか?

関連する問題