マクロを使用してQScriptEngine
から継承する場合にカスタム クラスを追加できるとは対照的に、はこの機能を直接提供しません。QObject
Q_SCRIPT_DECLARE_QMETAOBJECT
QJSEngine
Qt メタオブジェクト システムを使用して Javascript のインターフェイスを提供することはできますが、オブジェクトを C++ でインスタンス化し、それを Javascript コンテキストに追加する必要があります。次に、そのスロット、 で定義されたメソッドQ_INVOKABLE
、および で定義されたプロパティQ_PROPERTY
はすべて、Javascript ランタイム内からアクセスできます。
これで、Javascript オブジェクトとしてラップされCustomClass
た特定のカスタム クラスのインスタンスを作成するファクトリを作成できます。QJSEngine
class CustomClassFactory : public QObject
{
Q_OBJECT
public:
CustomClassFactory(QJSEngine* engine) : m_engine(engine) {}
Q_INVOKABLE QJSValue createInstance() {
// The engine takes ownership and destroys the object if no longer required.
return m_engine->newQObject(new CustomClass());
}
private:
QJSEngine* m_engine;
}
ファクトリ インスタンスを構築し、Javascript ランタイムのグローバル オブジェクトに追加する必要があります。
QJSEngine engine;
QJSValue factoryObj = engine.newQObject(new CustomClassFactory());
engine.globalObject().setProperty("_customClassFactory", factoryObj);
これで、Javascript でオブジェクトを構築できるようになりました。
var obj = _customClassFactory.createInstance()
ここまで来たので、カスタム クラスのコンストラクターを Javascript ランタイムにさらに挿入します。
QJSEngine engine;
// Again, the QJSEngine will take ownership of the created object.
QJSValue factoryObj = engine.newQObject(new CustomClassFactory());
engine.globalObject().setProperty("_customClassFactory", factoryObj);
engine.evaluate(
"function CustomClass() {"
" return _customClassFactory.createInstance()"
"}");
ほら、カスタム Javascript クラスのように、Javascript で C++ オブジェクトを構築できるようになりました。
var obj = new CustomClass()
前述のWebSocket
API については、その目的のためにラップすることができますQtWebSocket
。提案されたアプローチを思いついたとき、まさにそれが必要でした。
簡単にするために、コンストラクターのパラメーターを省略しましたが、単純に追加することもできます。
PS: 公式ドキュメントへのリンクをもっと追加したかったのですが、評判が悪いため許可されていません。