【问题标题】:Can not initialize qml property to {}无法将 qml 属性初始化为 {}
【发布时间】:2017-10-08 05:40:52
【问题描述】:

property variant a: {} 似乎不起作用。 a 最终是未定义的,而不是空字典。

我对 Javascript 不是很有经验...初始化属性以保存 empty 字典的正确方法是什么?

以下 qml 在控制台上打印“qrc:/main.qml:13: TypeError: Type error”。然而,如果a 被初始化为{"dummyentry": 42},那么 记录预期的结果。

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3

ApplicationWindow {
    visible: true; width: 600; height: 200

    property variant a: {}

    Component.onCompleted: {
        console.log("initial a="+JSON.stringify(a)) // TypeError: Type error
        a["newkey"] = 999  // gets "TypeError: Type error"
        console.log("updated a="+JSON.stringify(a))
    }
}

【问题讨论】:

标签: qml


【解决方案1】:

您可以参考Qt documentation:

QML 语法定义属性值初始化赋值右侧的花括号表示绑定赋值。这在初始化 var 属性时可能会造成混淆,因为 JavaScript 中的空花括号可以表示表达式块或空对象声明。如果您希望将 var 属性初始化为空对象值,则应将花括号括在括号中。

因此,当使用property var a: {} 时,花括号被解释为空表达式,其结果未定义。

使用property var a: ({}) 语法,您将创建一个空的JS 对象。您可以向其中添加属性和方法,但只需一组属性,它就可以像字典一样工作。

您可以通过两种方式访问​​对象属性:

objectName.propertyName
objectName["propertyName"]

在这里您可以找到更多关于 JS 对象的信息:link

【讨论】:

    【解决方案2】:

    一定是qml语法问题。解决方法是说

     property variant a: ( {} )
    

    正如问题中所述,确实可以说

     property variant a { "somekey": value }
    

    ...没有括号。

    有谁知道 qml 是如何解释一个朴素的“{}”,以及为什么它会导致undefined

    【讨论】:

    • (更老更聪明的自我回答)propname: { ... }{...} 视为 javascript 函数体,因此您必须显式地“返回 ...”一个值。只是从函数末尾掉下来返回 undefined。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 2011-02-04
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多