私はJavaスクリプトでこのメソッドを呼び出したとき、それは型のオブジェクトを返します。
QVariant(MyObject*)
それは私がスクリプトの中で、さらにそれを使用することができるように自動的にQJSValueに変換することが可能です場合、私は思ったんだけど?
私はJavaスクリプトでこのメソッドを呼び出したとき、それは型のオブジェクトを返します。
QVariant(MyObject*)
それは私がスクリプトの中で、さらにそれを使用することができるように自動的にQJSValueに変換することが可能です場合、私は思ったんだけど?
スクリプト内のMyObjectを参照する前に、以下のメソッドを呼び出すだけです。
qmlRegisterType<MyObject>("", 1, 0, "MyObject");
その後createMyObject方法は、任意の変換せずに正しい型を返します。
var obj = createMyObject();
MyObject
実は私たちは
Q_INVOKABLE QObject* createMyObject();
に
Q_INVOKABLE MyObject* createMyObject();
以下の方法の種類を変更した場合
それは私が(... QJSEngineにQListにを公開しようとしているで立ち往生した瞬間に)スクリプトのためQJSEngineを使用しようと、似たような状況にいるにも
qmlRegisterType
QJSEngine::newQObject()
メソッドを使用できます。
使用newQObject()はQObject(またはサブクラス)のポインタをラップします。 newQObject()は、プロキシスクリプトオブジェクトを返します。プロパティ、子、およびQObjectの信号およびスロットは、プロキシオブジェクトのプロパティとして使用できます。それがQtメタオブジェクトシステムを使用して動的に行われるため、バインディングコードは必要ありません。
詳細はQJSEngine Class: QObject Integrationを参照してください。
はい、わかります。しかし、戻り値をQJSValueに変換するには、クラス内のすべてのQ_INVOKABLEのラッパーが必要です。 – Maxym
Java ScriptはQVariantを不明なラッパーとして使用しているようです。値は簡単に渡すことができますが、そのプロパティのうちのどれも使用できず、そのメソッドのどれも呼び出せません。スクリプトで使用するには、QJSValueに変換する必要があります。私が見つけた唯一の方法は、次のようにヘルパー関数を宣言している:
Q_INVOKABLE QJSValue convert(QVariant var)
{
return _engine.newQObject(var.value<QObject*>());
}
それはQJSValueにQVariantを変換することが可能です:
var obj = convert(createMyObject());
とOBJだから今タイプ
MyObject
のものであろうそれはスクリプトで使用することができます。
良い解決策。それに注意してください:)。 –
その後、(qmlRegisterTypeを使用して)より正確な解が見つかりました。私の最近の答えを見てください。 – Maxym
せずに作業を開始します
私は既存の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 *))の型を見つけるのですか?
QmlなしでJSエンジンを使用している場合は動作しません。 –
意外にもそうです!私はqmlを使用せず、qmlRegisterTypeで動作し、qRegisterMetaTypeでは使用しません。 – Maxym