c++ - 向 Qt 脚本引擎公开基于模板的容器类?

标签 c++ qt

情况

我有几个 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> 的整个实例。 .

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

最佳答案

其中之一应该有效:

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

  2. 您可以将 vector 类型注册到脚本引擎

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

关于c++ - 向 Qt 脚本引擎公开基于模板的容器类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24423788/

相关文章:

python - 更改 QMenu 项目的背景颜色

qt - 如何从 .ui 文件中读取 qt5 中的小部件?

c++ - 更改 boundingRect 后的 QGraphicsItem 位置

c++ - 在主线程之间共享一个变量

java - 将 native C++ 代码转换为 Java

c++ - 标准 C++ 中是否有一种可移植的方法来检索主机名?

c++ - 哈希表创建

c++ - 仅在 C++ 源文件中查找字符串的正则表达式

c++ - 对打开的文档执行 Word 自动化是否安全?

c++ - 如何同时运行两个线程? Qt C++