qml 中 default property(默认属性)

qml 中 default property(默认属性)
一、基础知识1.1. 什么是默认属性每个 QML 对象类型组件都有且仅有一个默认属性。默认属性的作用是当你把一个对象写在另一个对象内部时这个子对象会自动被赋值给父对象的默认属性而不需要显式写出属性名。它是 QML 声明式语法的核心支撑之一让代码看起来像自然的层级结构。1.2Item及其子类的默认属性对于Item以及所有继承自Item的可视元素如Rectangle、Text、Item本身其默认属性是data。data是一个listObject可以容纳任何类型的 QML 对象包括可视的Item和非可视的Timer、QtObject等。可视对象总称为childer不可视对象总称为resource//平时书写方式 Item { Rectangle { ... } Timer { ... } } //对应的本质代码 Item { data: [ Rectangle { ... }, Timer { ... } ] }1.3如何实现默认属性重定向在自定义 QML 类型中你可以使用default property关键字来指定另一个属性作为默认属性从而覆盖原有的默认属性。语法示例这就把这个Item的默认属性从它自己的data变成了someItem.data。Item { default property alias myContent: someItem.data }关键约束一个类型只能有一个默认属性。默认属性通常是对象或列表类型如listItem、listObject、alias到列表属性二、结合自定义dialog例子深度剖析BaseDialog.qml代码Item { id: root //一堆外部可用属性 property string dialogKey: //*******默认属性重定向******** default property alias contentChildren: contentSlot.data property alias contentSlot: contentSlot property Item footerSlot: null Dialog { id: dialog //背景 background: Item { } //标题栏 header: Rectangle { } contentItem: Item { id: contentWrapper Item { id: contentSlot //*********根据子内容计算宽度和高度*********** implicitWidth: { var w 0 for (var i 0; i children.length; i) { //********children是可视子对象******** if (children[i].implicitWidth w) w children[i].implicitWidth } return w } implicitHeight: { } } } footer: root.footerSlot } }重定向了什么default property alias contentChildren: contentSlot.data这行代码把root这个Item的默认属性从root.data改成了contentSlot.data。也就是说任何直接写在BaseDialog内部的子对象都会自动成为contentSlot的孩子而不是root的孩子。FormDialog.qmlControls.BaseDialog { id: root dialogKey: formDialog titleText: 表单 property alias formContentLayout: formLayout //******直接写在baseDialog中的item那么自动被放入contentSlot.data因为在dasedialog中实现了默认属性重定向********* Item { id: contentWrapper ColumnLayout { id: formLayout } } footerSlot: Item { } }contentWrapper就是直接写在FormDialog内部的因此它会被自动放入contentSlot.data从而显示在对话框的内容区域。整个过程完全声明式没有额外的操作。三、什么情况下需要默认属性重定向默认属性重定向最核心的应用场景就是构建“容器型”可复用组件“壳”与“内容”分离且组件内部的视觉结构复杂需要把用户提供的内容嵌入到特定位置。