Qt+JS调用

Qt+JS调用
2012-12-23 09:34:00      我来说两句       作者:styyzxjq2009
收藏     我要投稿
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;
 
这样就可以按照例子程序正确执行。
 

你可能感兴趣的:(Qt+JS调用)