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

Posted

技术标签:

【中文标题】Qt/QML:std::vector<int> 处理【英文标题】:Qt/QML: std::vector<int> handling 【发布时间】:2019-02-07 16:14:33 【问题描述】:

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

根据此页面:https://doc.qt.io/qt-5/qtqml-cppintegration-data.html、std::vector&lt;int&gt; 如果向 qRegisterMetaType() 注册并作为属性公开/访问,则 QML 支持。但是,我无法让它工作。

我的类(可以由 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 时,它​​返回“未定义”(size() 不可调用)。如何迭代元素?上面链接的页面说“在 QML 中透明地支持某些 C++ 序列类型以表现得像 javascript 数组类型”(并在列表中提到 std::vector&lt;int&gt;),所以我希望 length 和索引访问能够正常工作。

【问题讨论】:

【参考方案1】:

文档说这个容器会自动转换为 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 接口时,由于某种原因导致那些自动转换 启动。我想这个问题仍然有效,幸运的是,解决方案是简单地不使用属性,而是使用简单的返回值。

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

【讨论】:

未将 std::vector 注册为元类型会产生“QMetaProperty::read: Unable to handle unregistered datatype 'std::vector' for property 'MyModel::myVector'” (所以它提前一步失败了?)。 std::vector我没用过,只有QVector,而且不需要注册。但也许 Qt 已经为 QVector 而不是为 vector 提供了。 也.. 试试qRegisterMetaType&lt;std::vector&lt;int&gt;&gt;() 不,使用 qRegisterMetaType<:vector>>() 注册与根本不注册具有相同的效果(使用 QVector 无需注册即可工作,但也不会暴露长度) . 您应该在下次提问时指定是否使用此类旧版本;)

以上是关于Qt/QML:std::vector<int> 处理的主要内容,如果未能解决你的问题,请参考以下文章

运行时错误:引用绑定到“std::vector<int, std::allocator<int>>”类型的空指针 (stl_vector.h)

对“std::vector<int, std::allocator<int>>”类型空指针的引用绑定

运行时错误:引用绑定到“std::vector<int, std::allocator<int> >”类型的空指针 (stl_vector.h)

创建 boost::tuple<std::string, std::string, int> 和 std::vector<int> 的映射

使用 std::optional 通过引用将 std::vector<int> 传递给函数

新分配的 std::vector<int> 元素是不是初始化为 0?