相比之下QScriptEngine
,如果自定义类继承自宏,则可以添加自定义类QObject
,Q_SCRIPT_DECLARE_QMETAOBJECT
而QJSEngine
不直接提供此功能。
您仍然可以使用 Qt 元对象系统为 Javascript 提供接口,但您必须在 C++ 中实例化该对象并将其添加到 Javascript 上下文中。然后它的槽、用 定义的方法Q_INVOKABLE
和用 定义的属性Q_PROPERTY
都可以从 Javascript 运行时中访问。
现在您可以创建一个工厂,CustomClass
为给定的QJSEngine
包装为 Javascript 对象创建自定义类的实例:
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:我会添加更多官方文档的链接,但由于缺乏声誉,我不允许这样做。