目录
官方解析
博主例子
编写应用脚本
Qt提供了JavaScript脚本对应用程序的支持。下面将全方位说明JavaScript在Qt中的应用。
Scripting Classes
如下的类为Qt应用程序添加脚本的功能。
QJSEngine:提供运行JavaScript代码的环境
QJSValue:充当Qt/JavaScrpit数据类型的容器
QJSValueIterator:QJSvalue的Java风格的迭代器
基础用法
评估脚本代码,先要创建一个QJSEngine对象,并且调用evaluate()这个函数,通过传递txt的脚本代码进行评估。
QJSEngine engine;
qDebug() << "the magic number is:" << engine.evaluate("1 + 2").toNumber();
返回值将是评估的结果,返回值为QJSValue这对象;这个返回值可以转换为标准C++或者Qt的类型(QVariant)。
通过使用QJSEngine对象注册自定义属性,可以让这个自定义属性在脚本中运行。通过QJSEngine的全局对象可以设置属性,这种骚操作很简单,如下代码:
engine.globalObject().setProperty("foo", 123);
qDebug() << "foo times two is:" << engine.evaluate("foo * 2").toNumber();
这里面的自定义属性已经在script环境中了,因此他可以脚本中生效。
把一个QObject对象放入Script引擎中
任何QObject派生类的实例都能放到script里面使用。
当QObject作为参数被QJSEngine::newQObject()调用时,Qt脚本包装器对象被创建,这个对象能够用来制作QObject的信号,槽,各种属性,以及继承树。
举一个栗子,一个QObject的派生类对象可以在脚本代码内命名为"myObject"
engine.globalObject().setProperty("foo", 123);
qDebug() << "foo times two is:" << engine.evaluate("foo * 2").toNumber();
这里将会创建一个全局的变量,变量名为myObject,并且是在脚本环境中。这个变量充当了底层C++对象的代理。注意,脚本的名称可以是任意的名称等,他与Qbject::objectName()无关
对上面例子的实现
源码如下:
myobject.h
#ifndef MYOBJECT_H
#define MYOBJECT_H
#include
class MyObject:public QObject{
Q_OBJECT
public:
MyObject(QObject *parent=0):QObject(parent){
m_myValue=9999;
}
~MyObject(){}
int m_myValue;
};
#endif // MYOBJECT_H
main.cpp
#include
#include
#include
#include
#include
#include "myobject.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QJSEngine engine;
qDebug()<<"The value is "<(engine.evaluate("myObject").toQObject());
qDebug()<<"The value is "<m_myValue;
return a.exec();
}