Qt文件閱讀筆記-編寫應用指令碼解析與例項
目錄
官方解析
編寫應用指令碼
Qt提供了JavaScript指令碼對應用程式的支援。下面將全方位說明JavaScript在Qt中的應用。
Scripting Classes 如下的類為Qt應用程式新增指令碼的功能。 QJSEngine:提供執行JavaScript程式碼的環境 QJSValue:充當Qt/JavaScrpit資料型別的容器 QJSValueIterator:QJSvalue的Java風格的迭代器
基礎用法 評估指令碼程式碼,先要建立一個QJSEngine物件,並且呼叫evaluate()這個函式,通過傳遞txt的指令碼程式碼進行評估。
QJSEngine engine; qDebug() << "the magic number is:" << engine.evaluate("1 + 2").toNumber();
返回值將是評估的結果,返回值為QJSValue這物件;這個返回值可以轉換為標準C++或者Qt的型別(QVariant)。 通過使用QJSEngine物件註冊自定義屬性,可以讓這個自定義屬性在指令碼中執行。通過QJSEngine的全域性物件可以設定屬性,這種騷操作很簡單,如下程式碼:
engine.globalObject().setProperty("foo", 123);
qDebug() << "foo times two is:" << engine.evaluate("foo * 2").toNumber();
這裡面的自定義屬性已經在script環境中了,因此他可以指令碼中生效。
把一個QObject物件放入Script引擎中 任何QObject派生類的例項都能放到script裡面使用。 當QObject作為引數被QJSEngine::newQObject()呼叫時,Qt指令碼包裝器物件被建立,這個物件能夠用來製作QObject的訊號,槽,各種屬性,以及繼承樹。
舉一個栗子,一個QObject的派生類物件可以在指令碼程式碼內命名為"myObject"
engine.globalObject().setProperty("foo", 123); qDebug() << "foo times two is:" << engine.evaluate("foo * 2").toNumber();
這裡將會建立一個全域性的變數,變數名為myObject,並且是在指令碼環境中。這個變數充當了底層C++物件的代理。注意,指令碼的名稱可以是任意的名稱等,他與Qbject::objectName()無關
博主例子
對上面例子的實現
原始碼如下:
myobject.h
#ifndef MYOBJECT_H
#define MYOBJECT_H
#include <QObject>
class MyObject:public QObject{
Q_OBJECT
public:
MyObject(QObject *parent=0):QObject(parent){
m_myValue=9999;
}
~MyObject(){}
int m_myValue;
};
#endif // MYOBJECT_H
main.cpp
#include <QJSEngine>
#include <QObject>
#include <QApplication>
#include <QJSValue>
#include <QDebug>
#include "myobject.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QJSEngine engine;
qDebug()<<"The value is "<<engine.evaluate("1+2").toNumber();
engine.globalObject().setProperty("foo",123);
qDebug()<<"foo times two is "<<engine.evaluate("foo*2").toNumber();
QObject *someObject=new MyObject;
QJSValue objectvalue=engine.newQObject(someObject);
engine.globalObject().setProperty("myObject",objectvalue);
qDebug()<<"QObject *someObject pointer address is "<<someObject;
qDebug()<<"Engine.evaluate(\"myObject\"):"<<engine.evaluate("myObject").toQObject();
MyObject *myObject=qobject_cast<MyObject*>(engine.evaluate("myObject").toQObject());
qDebug()<<"The value is "<<myObject->m_myValue;
return a.exec();
}