Qt+JS呼び出し


Qtが関数を呼び出す時は、以下の方法で、
QScript Egine 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
しかし、多くの時に私達の書いたシナリオのファイルはすべて比較的に気の向くままにして、1本あるいは複数の語句についてかもしれなくて、たとえば階乗を求めて、私達は再帰で実現することができて、しかしシナリオはreturnのこのような語句があることができなくて、最後の行で帰って、これは何度もの試験によって得たので、各自のコンパイルの環境と関係があるかもしれません.
「C++GUI Qt 4プログラミング」の第二版では、第22章の計算機の例では、シナリオが正確に実行できないので、それが理解できなくて、最後に関数の方法に変えなければならなくて、大丈夫です.しかし、全部関数の使い方が硬すぎて、修正を試みました.
Q Filefile(「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.flor(x));
せいにする
function factorial(n){    if(n<=1){        return 1;    } else{        return n*factorial(n-1)    } }
result=factoral(Math.flor(x));
大丈夫です
私の非再帰方法
result=1;while(x>1)    result*=x--;x=result;
このように例のプログラムに従って正確に実行できます.
本の中の多くの例はすべてreturn文を含んでいるので、すべて正常に運行することができなくて、間違いはJs文法の誤りをヒントして、returnを削除して、すべてgoes well!
ここでは、JSでQtコントロールを呼び出す例を参照してください.ハローワールドです.
http://blog.csdn.net/liuhongwei123888/article/details/6162159
jsファイルのコメントを削除しないといけないので注意してください.