A layout, anchors, and explicit size bindings can overwrite one another.
Name the owner of each axis and remove the competitors.
childrenRect is not inherently a binding loop.
It loops only when the children's actual geometry depends on the parent size being derived from that same childrenRect.
Accidental binding replacement
An imperative assignment to a bound property removes its binding.
Update the binding's source property instead, or intentionally install a new binding with Qt.binding(...).
For a Slider bound to model.volume, onMoved: model.volume = value updates the dependency and preserves the Slider's value binding.
Avoid onValueChanged for user intent because it also fires for programmatic changes.
Hidden structural coupling
parent.parent reaches through implementation details.
Use an id within one component and required properties or signals across component boundaries.
Plain JavaScript mutation
Bindings do not observe deep changes such as config.theme = "light" when config is a plain JavaScript object.
Replace config, use typed QML properties, or use an observable model.
Input without semantics
A TapHandler or MouseArea does not make a custom item a complete control.
Prefer Qt Quick Controls.
If a custom interactive item is necessary, provide keyboard activation, active focus, visible focus, an accessible role, and an accessible name.
Zero-size visual roots
Item has no useful implicit size by default.
A reusable visual component must expose a meaningful implicit size or receive actual geometry from its owner.
Wrong validation claim
A successful qmllint run proves static checks only.
An offscreen startup proves loading and instantiation only.
Neither proves pointer, keyboard, focus, accessibility, animation, or visual behavior.
# Common pitfalls
## Competing geometry owners
A layout, anchors, and explicit size bindings can overwrite one another.
Name the owner of each axis and remove the competitors.
`childrenRect` is not inherently a binding loop.
It loops only when the children's actual geometry depends on the parent size being derived from that same `childrenRect`.
## Accidental binding replacement
An imperative assignment to a bound property removes its binding.
Update the binding's source property instead, or intentionally install a new binding with `Qt.binding(...)`.
For a Slider bound to `model.volume`, `onMoved: model.volume = value` updates the dependency and preserves the Slider's `value` binding.
Avoid `onValueChanged` for user intent because it also fires for programmatic changes.
## Hidden structural coupling
`parent.parent` reaches through implementation details.
Use an id within one component and required properties or signals across component boundaries.
## Plain JavaScript mutation
Bindings do not observe deep changes such as `config.theme = "light"` when `config` is a plain JavaScript object.
Replace `config`, use typed QML properties, or use an observable model.
## Input without semantics
A `TapHandler` or `MouseArea` does not make a custom item a complete control.
Prefer Qt Quick Controls.
If a custom interactive item is necessary, provide keyboard activation, active focus, visible focus, an accessible role, and an accessible name.
## Zero-size visual roots
`Item` has no useful implicit size by default.
A reusable visual component must expose a meaningful implicit size or receive actual geometry from its owner.
## Wrong validation claim
A successful `qmllint` run proves static checks only.
An offscreen startup proves loading and instantiation only.
Neither proves pointer, keyboard, focus, accessibility, animation, or visual behavior.