QT:QTScript绑定C++的几种方法

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);

这个就不说了,按这种办法注册后,可以在脚本中直接调用

 

 

 

 

你可能感兴趣的:(C++,脚本,null,Class,qt,Constructor)