Qt+JS调用

Qt调用函数时,用以下方法,

QScriptEngine engine;

 engine.evaluate("function fullName() { return this.firstName + ' ' + this.lastName; }");
 engine.evaluate("somePerson = { firstName: 'John', lastName: 'Doe' }");
 QScriptValue global = engine.globalObject();
 QScriptValue fullName = global.property("fullName");
 QScriptValue who = global.property("somePerson");
 qDebug() << fullName.call(who).toString(); // "John Doe"
 engine.evaluate("function cube(x) { return x * x * x; }");
 QScriptValue cube = global.property("cube");
 QScriptValueList args;
 args << 3;
 qDebug() << cube.call(QScriptValue(), args).toNumber(); // 27


但是,很多时候我们的写的脚本文件都比较随意,可能就一条或者多条语句,比如求阶乘,我们可以用递归来实现,但是脚本不能有return这样的语句,用最后一行做返回,这是根据多次试验得出的,可能与各自的编译环境有关系吧,

在<C++ GUI Qt4 编程>第二版中,第22章的计算器例子,里面的脚本都没法正确执行,百思不得其解,最后不得已改用函数的方法,没问题,但是都用函数的方法太僵硬,于是尝试修改,

QFilefile("test.js");

    if (!file.open(QIODevice::ReadOnly)) {
        abortOperation();
        return;
    }
    QTextStream in(&file);
    in.setCodec("UTF-8");
    //in.setCodec("GBK");
    QString script = in.readAll();
    qDebug()<<script;
    file.close();
qDebug()<<display->text().toDouble();
    QScriptEngine interpreter;
    QScriptValue operand(&interpreter, display->text().toDouble());
    interpreter.globalObject().setProperty("x", operand);//这里设置全局属性x,在js中就可以调用到
    qDebug()<<interpreter.globalObject().property("x").toNumber();
   // QScriptValue myObject=interpreter.newObject();
    //myObject.setProperty("x",operand);
    QString fileName = "helloworld.qs";//保存错误信息,没其他用处
    QScriptValueList args1;
    args1<<operand;
    QScriptValue result = interpreter.evaluate(script,fileName);
    qDebug()<<result.toNumber()<<result.toString();
    qDebug()<<interpreter.globalObject().property("x").toNumber();
    QScriptValue test=result.call(QScriptValue(),args1);
    //qDebug()<<result;
    QScriptEngine myEngine;
     QScriptValue fun = myEngine.evaluate("(function(a, b) { return a + b; })");
     QScriptValueList args;
     args <<1<< 2;
     QScriptValue threeAgain = fun.call(QScriptValue(), args);
     qDebug()<<threeAgain.toNumber();
    qDebug()<<test.toNumber();
    if (!result.isNumber()) {
  //      abortOperation();
        return;
    }

原JavaScript代码是这样的

function factorial(n)
{
    if (n <= 1) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

return factorial(Math.floor(x));

改成

function factorial(n)
{
    if (n <= 1) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

result=factorial(Math.floor(x));

ok,没有问题

我的非递归方法

result=1;
while(x>1)
    result*=x--;
x=result;

这样就可以按照例子程序正确执行。


书中好多例子都是含return语句,都没法正常运行,出错提示Js语法错误,删除return,一切goes well!


这里引用一个在JS中调用Qt控件的例子,hello world!

http://blog.csdn.net/liuhongwei123888/article/details/6162159

注意去掉js文件中的注释,否则无法通过的





  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值