1、函数绑定
原函数
void ShowMessage(QString mes)
{
QMessageBox::about(NULL,"系统消息",mes);
}
绑定函数
QScriptValue ShowMessageFunc(QScriptContext *ctx, QScriptEngine *eng)
{
QString k = ctx->argument(0).toString();
ShowMessage(k);
return eng->nullValue();
}
与QTScript绑定
QScriptEngine engine;
QScriptValue func = engine.newFunction(ShowMessageFunc);
engine.globalObject().setProperty("ShowMessage", func);
QScriptValue res = engine.evaluate("ShowMessage(/"中华人民共和国/");");
2、类绑定
C++类定义
class Mes:public QObject
{
Q_OBJECT
public:
Mes(QObject * parent = 0)
: QObject(parent)
{
}
Q_INVOKABLE QString m_Text;
~Mes();
Q_INVOKABLE void ShowMessage(QString mes)
{
QMessageBox::about(NULL,"系统消息",mes);
}
};
这里有两个要求:
1、类定义时,必须继承于QObject
2、需要在QTScript中调用的类成员变量,声明时,要加Q_INVOKABLE 前缀
将已经定义好的C++类,绑定到QTScript中,有两种办法,各有优缺点吧,两咱办法如下:
第一种:
。。。。
Q_SCRIPT_DECLARE_QMETAOBJECT(Mes, QObject*);
。。。
QScriptValue mesClass = engine->scriptValueFromQMetaObject<Mes>();
engine->globalObject().setProperty(name,mesClass);
这个方法,优点是,当然用ShowMessage放在类的析构函数中,当类对象析构时,会发送一个析构的消息。即对象会在脚本析构时,在脚本中声明的变量也会析构。
缺点是,复杂继承关系时,会编译不能过,我还没有找到原因及解决办法。
只能使用缺省的析构函数创建对象。
第二种办法
。。。
Q_DECLARE_METATYPE(Mes*);
。。。
QScriptValue NewItem(QScriptContext *context, QScriptEngine *engine)//|| !context->argument(0).isQObject()
{
return engine->newQObject(new Mes());
}
QScriptValue ObjectToScriptValue(QScriptEngine *engine,T* const &in)
{ return engine->newQObject(in); }
template <class T> void ObjectFromScriptValue(const QScriptValue &object, T* &out)
{ out = qobject_cast<Mes*>(object.toQObject()); }
void BindClass(QScriptEngine *engine,QString name)
{
QScriptValue constructor = engine->newFunction(NewItem);
QScriptValue qsMetaObject = engine->newQMetaObject(&(T::staticMetaObject), constructor);
engine->globalObject().setProperty(name, qsMetaObject);
qScriptRegisterMetaType(engine,ObjectToScriptValue,ObjectFromScriptValue);
}
这种绑定的方法,只需要继承的最终类是QObject就可以了,可以使用自定义析构函数
缺点是,当然用showMessage放到类的析构函数中,当对象析构时会函出来,以确认对象析构时,当脚本析构时,没有报提示。QT的官方说明是说脚本系统会自动析构这些对象,但是我不确认。所以,我自己会再写一个FreeItem函数,来手工析构在脚本中创建的对象
3、C++对象的绑定
QScriptValue mes=engine.newQObject(&m_Mes);
engine.globalObject().setProperty("mes",mes);
这个就不说了,按这种办法注册后,可以在脚本中直接调用