C++ 向Qt脚本引擎公开基于模板的容器类? 处境

C++ 向Qt脚本引擎公开基于模板的容器类? 处境,c++,qt,C++,Qt,我有几个QVector的实例,我想让它们暴露在QScriptEngine中 在我的项目中,MyClass是多维数据“点”的缓存,它看起来像: class MyClass { public: MyClass(); /* Some functions */ private: int m_index; double m_time; QList<int> *m_data; }; class-MyClass { 公众: MyC

我有几个
QVector
的实例,我想让它们暴露在
QScriptEngine

在我的项目中,
MyClass
是多维数据“点”的缓存,它看起来像:

class MyClass
{
public:
    MyClass();
    /*
        Some functions
    */ 
private:
    int m_index;
    double m_time;
    QList<int> *m_data;
};
class-MyClass
{
公众:
MyClass();
/*
一些功能
*/ 
私人:
int m_指数;
双m_时间;
QList*m_数据;
};
我之所以这样做是因为我希望用户能够编写一些ECMA脚本来处理来自不同集合的这些“点”


问题: 如何向Qt脚本引擎公开整个容器及其内容?

我知道我可以将
MyClass
设置为
QObject
并调用以获取其
QScriptValue
,然后将该值设置为引擎的全局对象。但这只向脚本引擎公开“一点”,我需要的是传递整个
QVector
实例


(任何其他类型的解决方法也是很好的!)

其中一种方法应该有效:

  • 您可以将
    MyClass
    设置为QObject,然后使用
    QScriptEngine::newArray
    创建显式数组,为数组中的每个对象调用
    QScriptEngine::newObject
    ,并将脚本值添加到数组中;对于你所有的向量

  • 您可以将向量类型注册到脚本引擎

    qScriptRegisterSequenceMetaType<QVector<MyClass> >(engine)
    
    qScriptRegisterSequenceMetaType(引擎)
    
  • 您可以创建自己的脚本值类型:

    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();
        } 
    }
    
    Q_-DECLARE_元类型(QVector);
    qRegisterMetaType();
    qScriptRegisterMetaType(引擎,qScriptValueFromVector,qScriptValueToVector,QScriptValue());
    //任意转换函数(您还可以创建一个新对象,带有指向向量的指针):
    QScript值QScript值fromVector(QScript引擎*引擎,QVector常量和列表)
    {  
    QScript值结果=引擎->新数组(list.size());
    对于(int i=0;inewQObject(列表[i]);
    返回结果;
    }
    void qScriptValueToStringPtr(常量QScriptValue和value,QVector和list){
    list.clear();
    QScript值迭代器it(def);
    while(it.hasNext()){
    it.next();
    if(it.flags()&QScriptValue::SkipEnumeration)
    继续;
    列表