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;
这样就可以按照例子程序正确执行。