将基于模板的容器类暴露给Qt脚本引擎?

时间:2014-06-26 06:29:20

标签: c++ qt

情况

我有一些QVector<MyClass>的实例,我希望它们可以展示给QScriptEngine

在我的项目中,MyClass是多维数据的缓存&#34; point&#34;,它看起来像:

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

我这样做的原因是因为我希望用户能够编写一些ECMA脚本来处理这些&#34;点&#34;来自不同的集合。


问题

如何将整个容器及其内容公开给Qt脚本引擎?

我知道我可以MyClass成为QObject并致电QScriptEngine::newObject以获取QScriptValue,然后将值设置为引擎&#39}全球对象。但这只会暴露出一个问题&#34;到脚本引擎,我需要的是传递QVector<MyClass>的整个实例。

任何其他类型的解决方法也是welocme!

1 个答案:

答案 0 :(得分:3)

其中一项应该有效:

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