# 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.