我有一些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!)
答案 0 :(得分:3)
其中一项应该有效:
您可以使MyClass
成为QObject而不是使用QScriptEngine::newArray
创建显式数组,为数组中的每个对象调用QScriptEngine::newObject
,并将脚本值添加到数组中;对于你有的所有载体
您可以将矢量类型注册到脚本引擎
qScriptRegisterSequenceMetaType<QVector<MyClass> >(engine)
您可以创建自己的脚本值类型:
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();
}
}