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<int>
如果向 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<int>
),所以我希望 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::vectorstd::vector
我没用过,只有QVector
,而且不需要注册。但也许 Qt 已经为 QVector
而不是为 vector
提供了。
也.. 试试qRegisterMetaType<std::vector<int>>()
不,使用 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> 的映射