在 QML 中声明 JS-dicts 时如何使用 JS 数组作为键

Posted

技术标签:

【中文标题】在 QML 中声明 JS-dicts 时如何使用 JS 数组作为键【英文标题】:How to use JS Arrays as keys when declaring JS-dicts in QML 【发布时间】:2017-01-09 15:09:42 【问题描述】:

在 QML JS 实现中,我可以这样写:

property var dict1: ()
property var dict2:  'a':1, 'b':2, 'c':3 
// property var dict3:  [0,0]:1, [1,4]:5, [2,4]:3  // can't do this!

// but can do this.
Component.onCompleted: 
    dict1[[0,0]] = 1
    dict1[[1,4]] = 5
    dict1[[2,4]] = 3

所以最后一部分使用 JS-Arrays 作为字典中的键。然而,第 3 行 (dict3) 中的声明是不可能的。我不明白,如果预期结果可以通过其他方式实现,为什么一个符号不应该是可能的。

所以我的问题是:如何在不需要Component.onCompleted 或类似黑客的情况下实例化dict? 如果没有办法做到这一点,一个理由,将不胜感激。

【问题讨论】:

【参考方案1】:

JS 对象的键总是字符串。不存在数组即键或对象即键之类的东西。

dict1[[0,0]] = 1dict1['0,0'] = 1严格等效

底线是属性分配和属性访问自动将键转换为字符串。


尝试以下方法:

dict1[dict2] = 42
console.log(JSON.stringify(dict1))

输出: "0,0":1,"1,4":5,"2,4":3,"[object Object]":42

表达式dict2被转换为它的字符串表示形式并用作键。然后,您可以使用以下任何方法访问值 42

dict1["[object Object]"] dict1[dict2] dict1[dict1] 因为toString(dict1) 返回"[object Object]" dict1[()] 因为toString(()) 返回"[object Object]"

这些转换在对象创建时的执行方式不同,这意味着您不能执行property var dict2: [1,2]:3 。但是,property var dict2: "1,2":3 可以正常工作。

【讨论】:

谢谢!现在这对我来说很有意义!

以上是关于在 QML 中声明 JS-dicts 时如何使用 JS 数组作为键的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QML 创建全局图像?

如何声明多个 QML 属性而不单独处理每个属性?

在 .qml 文件中声明字符串

如何在 QML 中添加和使用资源?

如何更改 Qt QML Drawer 的阴影颜色(不声明自定义样式)?

导入 JavaScript 时如何在 QML 中使用绝对路径?