2014-06-26 38 views
2

情況

我有一些QVector<MyClass>的實例,我希望它們能夠接觸到QScriptEngine公開基於模板的容器類到Qt腳本引擎?

在我的項目,MyClass是多維數據「點」緩存,它看起來像:

class MyClass 
{ 
public: 
    MyClass(); 
    /* 
     Some functions 
    */ 
private: 
    int m_index; 
    double m_time; 
    QList<int> *m_data; 
}; 

我爲什麼這樣做的原因是因爲我希望用戶能夠寫一些ECMA腳本處理來自不同集合的這些「點」。


問題

如何暴露整個容器和它的內容Qt的腳本引擎?

我知道我可以做一個MyClassQObject呼籲QScriptEngine::newObject得到它的QScriptValue,然後將該值設置到發動機的全局對象。但是這隻向腳本引擎提供「一點」,我需要的是通過QVector<MyClass>的整個實例。

任何其他類型的解決辦法是welocme太!)

回答

2

一個這應該工作:

  1. 你可以做MyClass一個QObject,並且比QScriptEngine::newArray,呼叫建立一個明確的數組QScriptEngine::newObject用於數組中的每個對象,並將腳本值添加到數組中;所有載體必須

  2. 可以註冊向量類型的腳本引擎

    qScriptRegisterSequenceMetaType<QVector<MyClass> >(engine) 
    
  3. 你可以做自己的腳本值類型:

    Q_DECLARE_METATYPE(QVector<MyClass>); 
    qRegisterMetaType<QVector<MyClass> >(); 
    qScriptRegisterMetaType<QVector<MyClass> >(engine, qScriptValueFromVector, qScriptValueToVector, QScriptValue()); 
    //arbitrary conversion functions (you could also create a new object, with a pointer to a vector): 
    QScriptValue qScriptValueFromVector(QScriptEngine *engine, QVector<MyClass> const &list) 
    { 
        QScriptValue result = engine->newArray(list.size()); 
        for (int i=0;i<list.size();i++) 
         result.setProperty(i, engine->newQObject(list[i])); 
        return result; 
    } 
    void qScriptValueToStringPtr(const QScriptValue &value, QVector<MyClass> &list) { 
        list.clear(); 
        QScriptValueIterator it(def); 
        while (it.hasNext()) { 
         it.next(); 
         if (it.flags() & QScriptValue::SkipInEnumeration) 
          continue; 
         list << *it.value().toQObject(); 
        } 
    }