2017-10-08 83 views
1

property variant a: {} 似乎並沒有工作。 a最終未定義,而不是空字典。無法初始化QML屬性{}

我不是非常有經驗的JavaScript ...什麼是初始化屬性,以持有字典正確的方法是什麼?

以下QML打印 「QRC:/main.qml:13:類型錯誤:類型錯誤」 在控制檯上。但是,如果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)) 
    } 
} 
+1

此行爲全部在文檔http://doc.qt.io/qt-5/qml-var.html中闡述。對於行爲的*推理*對我來說不太清楚。 –

回答

0

它必須是qml語法問題。的解決辦法是說

property variant a: ({}) 

如問題指出,它工作說

property variant a { "somekey": value } 

...沒有括號。

有誰知道QML是如何解釋的樸實「{}」,爲什麼它會導致undefined

2

您可以參考Qt documentation

The QML syntax defines that curly braces on the right-hand-side of a property value initialization assignment denote a binding assignment. This can be confusing when initializing a var property, as empty curly braces in JavaScript can denote either an expression block or an empty object declaration. If you wish to initialize a var property to an empty object value, you should wrap the curly braces in parentheses.

因此,在使用時property var a: {},花括號中解釋爲空表達式,其結果是不確定的。

隨着使用property var a: ({})語法,你將創建一個空的JS對象。你可以添加它的屬性和方法,但只有一組屬性,它會像字典一樣工作。

您可以通過兩種方式訪問​​對象屬性:

objectName.propertyName 
objectName["propertyName"] 

在這裏你可以找到關於JS對象的詳細信息:link