【问题标题】:Expose a template-based container class to Qt script engine?向 Qt 脚本引擎公开基于模板的容器类?
【发布时间】:2014-06-26 06:29:19
【问题描述】:

情况

我有几个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&lt;MyClass&gt; 的整个实例。

也欢迎任何其他类型的解决方法!

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    其中一个应该可以工作:

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

    2. 可以将向量类型注册到脚本引擎

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

      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();
          } 
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多