Qt之javascript(QJSEngine)
c++调用js
-
调用js函数,QJSValue::call()
QJSValue fun = myEngine.evaluate("(function(a, b) { return a + b; })"); QJSValueList args; args << 1 << 2; QJSValue threeAgain = fun.call(args);
-
执行脚本 QJSEngine::evaluate
void QJSEngineDemo::loadJSFiles( const QString& JSPath) { QDir jsDir(QCoreApplication::applicationDirPath()); jsDir.cd("js"); QStringList jsFiles = jsDir.entryList(QStringList("*.js"),QDir::Files); qDebug() << jsFiles; foreach (QString file,jsFiles) { QString fileName = jsDir.absoluteFilePath(file); QFile scriptFile(fileName); if (!scriptFile.open(QIODevice::ReadOnly)){ qDebug()<<"File open fail:"<<scriptFile.errorString(); continue; } QTextStream stream(&scriptFile); QString contents = stream.readAll(); scriptFile.close(); QJSValue result = m_pJSEngin->evaluate(contents,fileName); printException(result); } } //调用js函数 //QJSValue jsObj = m_pJSEngin->globalObject(); //QJSValue result = jsObj.property(fun).call(QJSValueList()<<22<< 33); //qDebug() << "result" << result.toVariant(); //printException(result);
js中调用c++
-
第一种方法,在C++中创建对象,用newQObject代理脚本对象,脚本就可以访问该对象
QPushButton *button = new QPushButton; QJSValue scriptButton = myEngine.newQObject(button); myEngine.globalObject().setProperty("button", scriptButton); myEngine.evaluate("button.checkable = true"); qDebug() << scriptButton.property("checkable").toBool(); scriptButton.property("show").call(); // call the show() slot
-
第二种方法,直接将对象暴露给js,然js自己去创建对象
Constructors exposed to the meta-object system (using Q_INVOKABLE) can be called from the script to create a new QObject instance with JavaScriptOwnership. For example, given the following class definition: class MyObject : public QObject { Q_OBJECT public: Q_INVOKABLE MyObject() {} }; //The staticMetaObject for the class can be exposed to JavaScript like so: QJSValue jsMetaObject = engine.newQMetaObject(&MyObject::staticMetaObject); engine.globalObject().setProperty("MyObject", jsMetaObject); //Instances of the class can then be created in JavaScript: engine.evaluate("var myObject = new MyObject()");
debugger 的使用
脚本异常捕获
// Error
QJSValue errorValue = jsEngine->evaluate("...");
if (errorValue.isError())
{
qDebug() << "Error!";
qDebug() << errorValue.property("name").toString() << ", " \
<< errorValue.property("message").toString();
qDebug() << errorValue.property("lineNumber").toInt();
}
- 下面是一些可使用的属性:
- name : 名字
- message :错误的信息
- fileName : 文件名,evaluate 函数也可以指定一个文件名,它的作用也仅用于次。如果想加载一个文件运行,则必须加载到内存中,然后将文件的内容传递到该函数中。
- lineNumber :错误行号
- stack :调用堆栈。
Js与Qt之间传参
-
传数组
QJSValue jsObj = m_pJSEngin->globalObject(); QJSValue jsArray = m_pJSEngin->newArray(3); for (int i = 0; i < 3; ++i) { jsArray.setProperty(i, "data"+ QString::number(i)); } QJSValue result = jsObj.property("testArray").call(QJSValueList()<<jsArray);
-
传对象
QJSValue jsObj = m_pJSEngin->globalObject();QJSValue myObject = m_pJSEngin->newObject(); QJSValue myOtherObject = m_pJSEngin->newObject(); myObject.setProperty("myChild", myOtherObject); myObject.setProperty("text", "John Doe"); QJSValue result = jsObj.property("testStruct").call(QJSValueList()<<myObject);