Binding expression for nested properties not working
-
If there is an object like this:
//A.qml import QtQuick 2.0 import QtQml 2.0 Rectangle { property QtObject props: QtObject { property color mainColor: "blue" } color: props.mainColor }
And I use this object, properties of A instance's props properties (like
prop.mainColor
) can be read, imperative assigned to, assign to a binding. The problem is that binding expression does not work:import QtQuick 2.9 import QtQml 2.0 import QtQuick.Window 2.2 Window { A { id: a anchors.fill: parent props.mainColor: "red" // <<< error Component.onCompleted: { a.props.mainColor = Qt.binding(function(){return "red"}) // <<< wo a.props.mainColor = "red" // <<< works console.log(a.props.mainColor) // <<< works } } // Component.onCompleted works also in this scope }
error (if
property QtObject props: QtObject{...}
):
Cannot assign to non-existent property "mainColor"
error (if
property var props: Item{...}
):
Invalid grouped property access
Can someone explain why one can read the property (and assign) but not bind-assign?
-
I just ran into this issue myself, and I have a solution. I know this is an old topic, but since this was pretty much the only thing I could find on the internet about this problem, hopefully this can help someone else.
In order to bind to a property of the nested QtObject
props
from the of componentA
,props
needs to be a type of component that is known within the scope where it's properties are being accessed.To fix the code above, create a new file for the props Component:
//Props.qml import QtQml 2.0 QtObject { property color mainColor }
Now update the A component to use the Props component:
//A.qml import QtQuick 2.0 import QtQml 2.0 Rectangle { property Props props: Props { mainColor: "blue" } color: props.mainColor }
A few things to note here from my testing:
If you were to now add a new property to the instance ofProps
inA.qml
above, and try to bind a value to that , it would fail, because in the outside scope, that new property is not a known property of theProps
type.
Similarly, if you were to declare A.props asproperty QtObject props: Props { ... }
then binding to mainColor would fail because mainColor is not a property of QtObject, and props is being exposed as a QtObject (the base class).It appears that the property resolution for binding to a nested property is not able to infer additional properties added to an instance of an object, and can only be bound to known properties of the type being exposed.