標籤:style blog http color io os 使用 ar java
C++和JavaScript相互連信。今天就學習QtScript模組吧。
Qt 包含完全整合的 ECMA 標準指令碼引擎。Qt Script 整合了 QObject,為指令碼提供了 Qt 的訊號與槽 (Signals & Slots) 機制,可在 C++ 和指令碼之間進行整合。 指令碼支援可使開發事半功倍,QtScript提供指令碼錯誤報表,使用者可用自己的指令碼跟蹤程式缺陷.
下面是一個簡單的hello程式。
[cpp] view plaincopy
- //main.cpp
- #include <QtGui/QApplication>
- #include <QMessageBox>
- #include <QtScript/QtScript>
- #include <QPushButton>
- #include "mainwindow.h"
-
- int main(int argc, char *argv[])
- {
- Q_INIT_RESOURCE(helloscript);
- QApplication app(argc, argv);
- QScriptEngine engine;
-
- //國際化
- QTranslator translator;
- translator.load("helloscript_la");
- app.installTranslator(&translator);
- engine.installTranslatorFunctions();
-
- QPushButton button;
- QScriptValue scriptButton = engine.newQObject(&button);//產生C++對象的代理指令碼對象
- engine.globalObject().setProperty("button", scriptButton);//將對象註冊到javascript
-
- //讀取js檔案
- QString fileName(":/helloscript.js");
- QFile scriptFile(fileName);
- scriptFile.open(QIODevice::ReadOnly);
- QTextStream stream(&scriptFile);
- QString contents = stream.readAll();
- scriptFile.close();
-
- QScriptValue result = engine.evaluate(contents, fileName);//執行指令碼
- if(result.isError()) {//解析js檔案是否有錯誤
- QMessageBox::critical(0, "Hello Script",
- QString::fromLatin1("%0:%1: %2")
- .arg(fileName)//檔案名稱
- .arg(result.property("lineNumber").toInt32())//錯誤行號
- .arg(result.toString()));//錯誤資訊
- return -1;
- }
- return app.exec();
- }
[javascript] view plaincopy
- //helloscript.js
- button.text = qsTr(‘Hello World‘);//note that the qTr() function is used to allow for translation
- button.styleSheet = ‘font-style: italic; color: #12FF12‘;
- button.show();//調用show()槽函數
- button.clicked.connect(
- function(){
- print(‘Hello QtScript‘);
- }
- );
記住還需要在.pro檔案中加入:QT += script
1、QScriptEngine類為程式提供一個嵌入式指令碼環境。一個應用程式中可以添加多個指令碼引擎;每一個引擎都是一個輕量級自包含的虛擬機器。通過呼叫指令碼引擎的evaluate()函數可以執行指令碼.
[c-sharp] view plaincopy
- QScriptEngine engine;
- QScriptValue result = engine.evaluate("(3*2)-1");
- qDebug() << "Result: " << result.toInt32();
[cpp] view plaincopy
- QScriptEngine engine;
- QScriptValue func = engine.evaluate("(function(a, b) { return a+b;})");
- QScriptValueList args;
- args << 1 << 2;
- QScriptValue result = func.call(QScriptValue(), args);
- qDebug() << "Result: " << result.toInt32();
2、QScriptValue是一個Qt Script資料類型的容器,支援ECMA-262定義的類型,如:
未經處理資料類型:Undefined,Null,Boolean,Number,String,物件類型。
另外Qt Script還內建支援QVariant,QObject和QMetaObject.
>>對於基底物件(object-based)類型(包括Date和RegExp),使用QScriptEngine對象的newT()函數(如QScriptEngine::newObject())建立一個你期望的QScriptValue類型。
>>對於未經處理資料類型,直接使用QScriptValue建構函式載入。
isT()方法能夠被用來測試一個值是否是你確定的資料類型。toT()方法用來將QScriptValue轉換成其他類型。當然你也可以用qscriptvalue_cast()方法.
Qt之QtScript(一)