情况
我有几个 QVector<MyClass>
的实例我希望他们接触到 QScriptEngine
.
在我的项目中,MyClass
是多维数据“点”的缓存,它看起来像:
class MyClass
{
public:
MyClass();
/*
Some functions
*/
private:
int m_index;
double m_time;
QList<int> *m_data;
};
我这样做的原因是因为我希望用户能够编写一些 ECMA 脚本来处理这些来自不同集合的“点”。
问题
如何向 Qt 脚本引擎公开整个容器及其内容?
我知道我可以做MyClass
一个QObject
并调用 QScriptEngine::newObject
得到它的 QScriptValue
,然后将该值设置为引擎的全局对象。但这只会向脚本引擎暴露“一点”,而我需要的是传递 QVector<MyClass>
的整个实例。 .
(也欢迎任何其他类型的解决方法!)
最佳答案
其中之一应该有效:
您可以将
MyClass
设为 QObject,然后使用QScriptEngine::newArray
创建显式数组,调用QScriptEngine::newObject
对于数组中的每个对象,并将脚本值添加到数组中;对于您拥有的所有 vector您可以将 vector 类型注册到脚本引擎
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(); } }
关于c++ - 向 Qt 脚本引擎公开基于模板的容器类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24423788/