向Qt脚本引擎公开一个基于模板的容器类
Expose a template-based container class to Qt script engine?
情况
我有几个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
,并将脚本值添加到数组中;对于所有矢量,您都有 -
您可以将矢量类型注册到脚本引擎
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++方法:如何使其适用于模板的子类?
- 没有公共构造函数作为另一个类模板成员的类模板
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 在另一个类模板中使用不同的类模板
- 类成员函数参数列表是否可以依赖于模板参数?
- 专门处理一个参数(C++模板)的两个模板参数
- 依赖于模板的错误
- 还有另一个类模板专业化(在布尔参数上)
- 将 c++ 类成员函数专用于模板类
- C++ 使函数调用依赖于模板参数
- c ++如何将模板应用于模板类的孩子/朋友?
- 我正在为学校开发一个小班模板实验室,我的代码无法编译,它给了我一个未解析的外部符号
- 如何修复"没有依赖于模板参数的参数'glGenVertexArrays'......"C++ 中的错误
- 如何转发声明依赖于变量定义的类,而变体定义又依赖于模板化类?
- 是否可以定义一个非模板函数,该函数可以将模板化对象作为参数
- 如何在另一个类模板中定义完全专用类的构造函数
- 从另一个类模板类型推导派生的类模板
- 如何使用类型专用化模板方法,该类型本身就是一个模板,其中只有返回类型依赖于模板类型
- 仅专用于模板类的一个方法(部分)
- 如何将低级const应用于模板变量.我试图写一个const_cast实现