QtScript基础知识
js调用C++函数
QScriptValue Add(QScriptContext *context, QScriptEngine *engine)
{
QScriptValue a = context->argument(0);
QScriptValue b = context->argument(1);
return a.toNumber() + b.toNumber();
}
void ScriptCallFunc()
{
QScriptEngine engine;
QScriptValue func = engine.newFunction(Add);
engine.globalObject().setProperty("Add",func);
QScriptValue ret = engine.evaluate("(Add(1,2))");
qDebug()<<ret.toInt32()<<endl;
}
C++调用js函数
void FuncCallScript()
{
QScriptValue func = engine.evaluate("(function(a,b){ return a+b; })");
QScriptValueList args;
args<<1<<2;
QScriptValue result_ = func.call(QScriptValue(),args);
qDebug()<<result_.toInt32()<<endl;
}
C++调用js代码
void CallJsFile()
{
QScriptEngine engine;
QPushButton btn;
QScriptValue scriptBtn = engine.newQObject(&btn);
engine.globalObject().setProperty("button",scriptBtn);
QString scriptName(":/helloJS.js");
QFile scriptFile(scriptName);
scriptFile.open(QIODevice::ReadOnly);
QTextStream stream(&scriptFile);
QString content = stream.readAll();
QScriptValue result = engine.evaluate(content,scriptName);
if(result.isError()) {
QMessageBox::critical(0, "Hello Script",
QString::fromLatin1("%0:%1: %2")
.arg(scriptName)
.arg(result.property("lineNumber").toInt32())
.arg(result.toString()));
return -1;
}
}
//helloJS.js
button.text = 'Hello,world';
button.styleSheet = 'font-style:italic;color:#12FF12';
button.show();
button.clicked.connect(function(){ print('Hello QtScript');});
C++中获取JS中的返回值
Q_DECLARE_METATYPE(QList<int>)
void InvokeScript()
{
QScriptEngine myEngine;
qScriptRegisterSequenceMetaType<QList<int> >(&myEngine);
QScriptValue global = myEngine.globalObject();
myEngine.evaluate("var pack= new Array(); pack[0]=1; pack[1]='I am here.'; pack[2]=3;");
myEngine.evaluate("var intarr= new Array(); intarr[0]=1; intarr[1]=2; intarr[2]=3;");
QScriptValue vv = global.property("pack");
QScriptValue vi = global.property("intarr");
QList<int> vlist = qscriptvalue_cast<QList<int> >(vv);
for (int i = 0; i < vlist.size(); ++i) qDebug()<<vlist.at(i);
QList<int> ilist = qscriptvalue_cast<QList<int> >(vi);
for (int i = 0; i < ilist.size(); ++i) qDebug()<<ilist.at(i);
}
js调用C++函数
QScriptValue Add(QScriptContext *context, QScriptEngine *engine)
{
QScriptValue a = context->argument(0);
QScriptValue b = context->argument(1);
return a.toNumber() + b.toNumber();
}
void ScriptCallFunc()
{
QScriptEngine engine;
QScriptValue func = engine.newFunction(Add);
engine.globalObject().setProperty("Add",func);
QScriptValue ret = engine.evaluate("(Add(1,2))");
qDebug()<<ret.toInt32()<<endl;
}
C++调用js函数
void FuncCallScript()
{
QScriptValue func = engine.evaluate("(function(a,b){ return a+b; })");
QScriptValueList args;
args<<1<<2;
QScriptValue result_ = func.call(QScriptValue(),args);
qDebug()<<result_.toInt32()<<endl;
}
C++调用js代码
void CallJsFile()
{
QScriptEngine engine;
QPushButton btn;
QScriptValue scriptBtn = engine.newQObject(&btn);
engine.globalObject().setProperty("button",scriptBtn);
QString scriptName(":/helloJS.js");
QFile scriptFile(scriptName);
scriptFile.open(QIODevice::ReadOnly);
QTextStream stream(&scriptFile);
QString content = stream.readAll();
QScriptValue result = engine.evaluate(content,scriptName);
if(result.isError()) {
QMessageBox::critical(0, "Hello Script",
QString::fromLatin1("%0:%1: %2")
.arg(scriptName)
.arg(result.property("lineNumber").toInt32())
.arg(result.toString()));
return -1;
}
}
//helloJS.js
button.text = 'Hello,world';
button.styleSheet = 'font-style:italic;color:#12FF12';
button.show();
button.clicked.connect(function(){ print('Hello QtScript');});
C++中获取JS中的返回值
Q_DECLARE_METATYPE(QList<int>)
void InvokeScript()
{
QScriptEngine myEngine;
qScriptRegisterSequenceMetaType<QList<int> >(&myEngine);
QScriptValue global = myEngine.globalObject();
myEngine.evaluate("var pack= new Array(); pack[0]=1; pack[1]='I am here.'; pack[2]=3;");
myEngine.evaluate("var intarr= new Array(); intarr[0]=1; intarr[1]=2; intarr[2]=3;");
QScriptValue vv = global.property("pack");
QScriptValue vi = global.property("intarr");
QList<int> vlist = qscriptvalue_cast<QList<int> >(vv);
for (int i = 0; i < vlist.size(); ++i) qDebug()<<vlist.at(i);
QList<int> ilist = qscriptvalue_cast<QList<int> >(vi);
for (int i = 0; i < ilist.size(); ++i) qDebug()<<ilist.at(i);
}