在 QML 中设置子项 属性 的正确方法

Proper way to set a child item property in QML

每个人都知道如何通过这些元素的背景 属性 为按钮、弹出窗口等设置背景。但是我想知道,我如何为自己的自定义元素创建这样一个 属性 呢?我找到了一种方法,但它看起来很丑陋,而且我似乎找不到定义了 属性 的按钮、弹出窗口等的 qml 代码。所以我玩了一下,想出了像这样使用绑定的想法:

Item {
    id: root
    property Item background: Rectangle {
        color: "red"
    }
    Binding {
        target: root.background
        property: "parent"
        value: root
    }
    Binding {
        target: root.background
        property: "anchors.fill"
        value: root
        when: root.background.parent == root
        delayed: true
    }
}

如前所述,如果您需要声明子项的许多属性,那看起来会很烦人。那么,Qt 是如何做到的或者正确的做法是什么?

// ItemWithBackground.qml
Item {
    property alias background: backgroundLoader.sourceComponent

    Loader {
        id: backgroundLoader
        anchors { fill: parent }
        sourceComponent: Rectangle { color: 'red' } // default background implementation 
    }
}

// Usage example:
ItemWithBackground {
    background: Rectangle {
        color: 'green'
    }
}

如果您使用的是最新的 Qt 版本,请查看使用内联组件。它们使您可以像这样轻松创建 API。