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)
继续;
列表