First you can open the docs and read why QScriptEngine::scriptValueFromQMetaObject() is not suitable for your MyObj class.
Q_OBJECT
public:
MyObj(){}
~MyObj(){}
public slots:
void calculate() { qDebug() << Q_FUNC_INFO; }
};
#include "main.moc"
int main(int argc, char **argv){
QScriptEngine engine;
QScriptValue MyObjClass = engine.scriptValueFromQMetaObject<MyObj>();
engine.globalObject().setProperty("MyObj", MyObjClass );
QScriptValue val = engine.evaluate("var le = new MyObj; le.calculate();");
if(val.isError())
qDebug() << val.toString();
}
class MyObj : public QObject {
Q_OBJECT
public:
MyObj(){}
~MyObj(){}
public slots:
void calculate() { qDebug() << Q_FUNC_INFO; }
};
#include "main.moc"
int main(int argc, char **argv){
QScriptEngine engine;
QScriptValue MyObjClass = engine.scriptValueFromQMetaObject<MyObj>();
engine.globalObject().setProperty("MyObj", MyObjClass );
QScriptValue val = engine.evaluate("var le = new MyObj; le.calculate();");
if(val.isError())
qDebug() << val.toString();
}
To copy to clipboard, switch view to plain text mode
or use QScriptClass or QScriptable to avoid QObject legacy. You can also use one of the prototype based approaches, i.e.:
QScriptValue MyObj_ctor(QScriptContext *context, QScriptEngine *engine) {
return engine->undefinedValue();
}
QScriptValue MyObj_prototype_calculate(QScriptContext *context, QScriptEngine *engine)
{
qDebug() << "calculate";
return engine->undefinedValue();
}
// ...
QScriptEngine engine;
QScriptValue ctor = engine.newFunction(MyObj_ctor);
ctor.property("prototype").setProperty("calculate", engine.newFunction(MyObj_prototype_calculate));
QScriptValue global = engine.globalObject();
global.setProperty("MyObj", ctor);
QScriptValue MyObj_ctor(QScriptContext *context, QScriptEngine *engine) {
return engine->undefinedValue();
}
QScriptValue MyObj_prototype_calculate(QScriptContext *context, QScriptEngine *engine)
{
qDebug() << "calculate";
return engine->undefinedValue();
}
// ...
QScriptEngine engine;
QScriptValue ctor = engine.newFunction(MyObj_ctor);
ctor.property("prototype").setProperty("calculate", engine.newFunction(MyObj_prototype_calculate));
QScriptValue global = engine.globalObject();
global.setProperty("MyObj", ctor);
To copy to clipboard, switch view to plain text mode
What you choose depends on how you intend to use the class.
Bookmarks