QScriptEngine编译JavaScript

一、编译

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()<<"编译成功";
}

二、运行

  1. 脚本的运行

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

附demo链接:QT中使用QScriptEngine引擎编译运行JavaScript脚本-其它文档类资源-CSDN下载

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值