Qt/QML: std::vector<int> 处理

Qt/QML: std::vector<int> handling

编辑: 问题仅出现在 5.6 上,根据 https://doc.qt.io/qt-5.6/qtqml-cppintegration-data.html 与最新版本相比,支持的 "native" 类型集有所减少......

根据此页面:https://doc.qt.io/qt-5/qtqml-cppintegration-data.html,如果使用 qRegisterMetaType() 和 exposed/accessed 作为 属性 注册,QML 支持 std::vector<int>。但是,我无法让它工作。

我的 class(可以通过 QML 实例化,所以这个级别有效)有这样的声明:

// prop decl
Q_PROPERTY(std::vector<int> myVector READ myVector NOTIFY myVectorChanged)
// read accessor
Q_INVOKABLE std::vector<int> recordTime() const;
// signal (in signal section)
void myVectorChanged();

通过

注册
qRegisterMetaType<std::vector<int> >("std::vector<int>");

当我将某些东西推入向量并尝试访问 myVector.length 或 myVector.size 时,它 returns 'undefined'(无法调用 size())。如何遍历元素?上面链接的页面说 "Certain C++ sequence types are supported transparently in QML to behave like JavaScript Array types"(并在列表中提到 std::vector<int>),所以我希望 length 和索引访问有效。

文档说这个容器会自动转换为 JS 数组。您不需要注册任何东西。

当然转换会是一个副本,所以修改它不会修改原来的数组,使用方法和使用普通JS数组是一样的。它绝对应该有一个 length(不是 length())属性 并支持通过 [].

进行索引访问

更新:

在你的失败故事之后,我决定实际上 运行 一个简单的测试:

class Test : public QObject {
    Q_OBJECT
  public slots:
    std::vector<int> test() { return std::vector<int> {1, 2, 3, 4, 5, 6, 7}; }
};

// in main.cpp
qmlRegisterType<Test>("Core", 1, 0, "Test"); 

  // in qml
  Test {
    Component.onCompleted: {
      var t = test()
      console.log(t.length, t) // qml: 7 [1,2,3,4,5,6,7]
    }
  }

如您所见,它提供了预期的输出,无需注册任何内容。

IIRC Qt 存在一个问题,当您使用 Q_PROPERTY 界面时,由于某种原因导致那些自动转换为 而不是 启动。我想这个问题仍然有效,幸运的是解决方案是简单地不使用 属性 而是简单的 return 值。

如果您的问题仍然存在,我建议您仔细检查您的代码,或者如有必要,清理并重建您的项目,因为除了 属性 相关问题外,转换肯定会按预期进行。