1. 程式人生 > >Qt文件閱讀筆記-編寫應用指令碼解析與例項

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();
}