不能在 QML 中创建地图数据类型吗?

Posted

技术标签:

【中文标题】不能在 QML 中创建地图数据类型吗?【英文标题】:Is it not possible to create a map datatype in QML? 【发布时间】:2016-06-02 18:17:29 【问题描述】:

我正在尝试在 QML 的函数中创建地图。我试过这个:

    var myMap= new Map()
    var length = myArray.count
    for (var i = 0; i < length; i++)
        myMap.set(i, true)

它不会抱怨 Map 本身的创建,而是 set 方法。这是应用程序在运行时输出的内容:

TypeError: Property 'set' of object  is not a function

我以此作为 Map 可用方法的参考:

Map documentation

看起来 QML 不支持调用 set 方法。我试图找到一些关于 QML 支持和不支持的文档,但找不到。这让我很难知道,因为在我编写并运行代码之前之后我无法找到。

是否有人能够在 QML 中使用 Map 和/或知道在哪里可以找到有关 QML 支持的 javascript 功能的文档?

【问题讨论】:

你使用什么版本的 Qt? @FilipHazubski 5.6 所以QML根本不支持Map.set()函数。这是不幸的。 您在提供的 qml 文件片段中是否使用import QtLocation 5.3 作为示例? 如果不支持也没关系。但是找到正确的文档很重要。另外,您为什么要询问 Qt Location?问题是关于 Map 数据类型,而不是组件。这在问题标题中已明确说明。 【参考方案1】:

我猜你误会了what's the Map object in QML。 我强烈怀疑这不是您所期望的。

相反,QML 有 automatic type conversion between QVariantMap and JavaScript object。

这意味着当您在 QML 环境中工作并想要创建 map 时,应该依赖纯 JavaScript 对象及其键值模型。

这是一个问题:

var myMap=  ;
var length = myArray.count;
for (var i = 0; i < length; i++)
    myMap[i] = true;

【讨论】:

谢谢。我现在看到 QML 不支持 Map 数据类型(及其方法,这是 Javascript 中的一个东西)。我想我必须改为对 Object 类型进行操作。最终创建并公开一个包装 QMap 到 QML 的 C++ 类。【参考方案2】:

这对我有用(Qt 5.14.2)。

...

Label 
    property var stateInfo: (new Map([
            [MyCustomCPPType.State.Idle, "Idle"],
            [MyCustomCPPType.State.Collecting, "Collecting"],
            [MyCustomCPPType.State.Done, "Done"]
    ]))

    text: stateInfo.get(MyCustomCPPTypeInstance.state)

...

【讨论】:

【参考方案3】:

我认为我以前的答案版本不正确。

据我了解,可以在 QML 中使用的所有 JS 对象、属性和函数都列在here 中。 ECMA-262 规范仅代表对文档中列出的对象的引用,没有别的。很遗憾,您将无法正确使用Map 对象。

【讨论】:

以上是关于不能在 QML 中创建地图数据类型吗?的主要内容,如果未能解决你的问题,请参考以下文章

无法取消嵌套 json 文件以在 r 中创建地图?

Qt QML - 在Qt Location创建我自己的形状

QML 地图绑定 v2

如何在谷歌地图api中创建多个信息窗口

在PyQt中创建MapQuickItem并将其添加到Map中

如何使用 QML/QtLocation 模块在地图上显示大量离线数据?