一、编译
1.脚本函数的编译:
QScriptValue QScriptEngine::evaluate(const QString &program, const QString &fileName = QString(), int lineNumber = 1)
参数program为需要编译的脚本内容。
!!!需要注意的是:脚本内容需要用英文字符“()”括起来。
例如:需要编译的脚本为:QString strText = ”function myfun(a,b){ return a+b;} “;
那么组合起来的脚本内容为
QString strScriptText = “(“ + strText + “)”;
必须加上括号才能正常编译,原因未知。
2.捕获异常:
Bool QScriptEngine::hasUncaughtException() const
如果脚本错误,捕获到异常,返回false;脚本编译正确,未捕获到异常,返回true。
可通过int QScriptEngine::uncaughtExceptionLineNumber() const
方法获取错误行数作为错误信息返回提示。
3.设置全局属性
void QScriptValue::setProperty(const QString &name, const QScriptValue &value, const QScriptValue::PropertyFlags &flags = KeepExistingFlags)
将编译的脚本存储到引擎的全局对象中,之后使用可通过QScriptValue QScriptValue::property(const QString &name, const QScriptValue::ResolveFlags &mode = ResolvePrototype) const的方法,直接通过设置的属性名称获取属性值。
QString str = "(" + ui->textEdit->toPlainText() + ")";
QScriptValue fun=m_GloableEngine.evaluate(str);
if (m_GloableEngine.hasUncaughtException())
{
int line = m_GloableEngine.uncaughtExceptionLineNumber();
QString error = m_GloableEngine.uncaughtException().toString();
QString errorMsg = QString::number(line) + " " + error;
qDebug()<<"编译失败"<<errorMsg;
}
else
{
m_GloableEngine.globalObject().setProperty("fun",fun);
qDebug()<<"编译成功";
}
二、运行
-
脚本的运行
QScriptValue QScriptValue::call(const QScriptValue &thisObject = QScriptValue(), const QScriptValueList &args = QScriptValueList())
后一个参数为函数的参数,参数类型可以为明确的值,也可以为对象。
返回值为脚本执行结果。为整型0时执行成功。
QScriptValue value= m_GloableEngine.globalObject().property("fun");
qDebug()<<value.toString();
QScriptValue person = m_GloableEngine.newObject();
m_GloableEngine.globalObject().setProperty("Own",person);
person.setProperty("姓名",QString("张三"));
person.setProperty("性别",QString("男"));
person.setProperty("分数",98);
QScriptValueList args;
args<<person<<QString("七年级(1)班");
QScriptValue res= value.call(QScriptValue(),args);
QString str;
if(res.toInt32()==0)
{
str="执行成功";
}
else
{
str="执行失败";
}
三、QScriptEngine脚本引擎的函数介绍。
1创建object对象:QScriptValue QScriptEngine::newObject()
QScriptValue person = m_GloableEngine.newObject();
m_GloableEngine.globalObject().setProperty("Person",person);
2.创建函数:QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionSignature fun, int length = 0)
QScriptValue funPrintf = m_GloableEngine.newFunction(JsPrintf);
m_GloableEngine.globalObject().setProperty("Printf",funPrintf);
函数形式为:QScriptValue 函数名称(QScriptContext *context, QScriptEngine *engine){}
QScriptValue JsPrintf(QScriptContext *context, QScriptEngine *engine)
{
QString res = "";
for(int i = 0;i<context->argumentCount();i++)
{
res += context->argument(i).toString() + " ";
}
qDebug()<<res;
return 0;
}
其中:
QScriptContext *context
获取函数参数个数:int QScriptContext::argumentCount() const
获取第index个参数的值:QScriptValue QScriptContext::argument(int index) const
返回与此QScriptContext关联的' this'对象:QScriptValue QScriptContext::thisObject() const
QScriptEngine *engine 为创建该函数的脚本引擎
3.创建数组:QScriptValue QScriptEngine::newArray(uint length = 0)
QScriptValue value = engine->newArray(vec.size());
for(int i = 0;i<(int)vec.size();i++)
{
value.setProperty(i,vec[i]);
}
四、移除
直接m_GloableEngine.globalObject().setProperty(funName,QScriptValue());