不能在 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 中创建地图数据类型吗?的主要内容,如果未能解决你的问题,请参考以下文章