与QScriptEngine 相比,如果自定义类从QObject 继承,您可以使用Q_SCRIPT_DECLARE_QMETAOBJECT 宏添加自定义类,QJSEngine 不直接提供此功能。
您仍然可以使用 Qt 元对象系统为 Javascript 提供接口,但您必须在 C++ 中实例化该对象并将其添加到 Javascript 上下文中。
然后它的槽、Q_INVOKABLE 定义的方法和Q_PROPERTY 定义的属性都可以从 Javascript 运行时中访问。
现在您可以创建一个工厂,为包装为 Javascript 对象的给定 QJSEngine 创建自定义类 CustomClass 的实例:
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 中构造 C++ 对象,就像您自定义 Javascript 类一样:
var obj = new CustomClass()
对于提到的WebSocket API,您可以为此目的包装QtWebSocket——这正是我提出建议方法时所需要的。
请注意,为简单起见,我省略了构造函数的参数,但也可以简单地添加它们。
PS:我会添加更多官方文档的链接,但由于缺乏声誉,我不允许这样做。