如何定义内联 QML 组件并覆盖 属性?

How to define QML component inline and override a property?

我正在尝试做一些看似简单的事情,但失败了:定义一个简单的内联文本格式组件,然后用不同的文本多次实例化它。这是代码

Item {
.
.
.
Component {
    id: favButtonLabelText
    Text {
        text: "Blah!"
        color: StyleSingleton.xNavPrimaryText
        font.family: StyleSingleton.xNavTextFont
        font.pointSize: 28
    }
}
.
.
.       
Loader { sourceComponent: favButtonLabelText; text: "Diameter" }

在 Loader 行,文本 属性 无效。尝试在组件上定义 属性 或别名会被 "Component objects cannot declare new properties" 拒绝。

我在文档中找到的唯一示例显示了覆盖在内联组件中定义的 Rectanglex 属性。在我看来,覆盖 Text 元素的 text 属性 是类似的。

我该怎么做?

由于 Loader 将自己设置为其正在加载的组件的上下文对象,您可以在其中定义一个 属性 并在加载的 Item.[=15 中使用它=] 但是,您必须使用您的项目未使用的 属性 名称,否则它将被您的项目自己的 属性 遮蔽,并且没有简单的方法来明确访问上下文 属性。

Component {
    id: favButtonLabelText
    Text {
        text: foobar
    }
}
Loader {
    sourceComponent: favButtonLabelText
    property string foobar: "Diameter"
}

正如 GrecKo 已经说过的那样,可以使用 Loader 的自定义 属性,在他的例子中有另一个名字 foobar.

如果您不对已加载的内容进行任何花哨的重新设置 Item,也可以使用相同的名称,并使用 parent.property

进行引用
Component {
    id: textComponent
    Text {
        // Use "parent" to reference the property of the parent,
        // which is by default the Loader
        text: parent.text
    }
}

Column {
    Repeater {
        model: ['hallo welt', 'hello world', 'Bonjour monde', '你好世界']
        delegate: Loader {
            property string text: modelData
            sourceComponent: textComponent
        }
    }
}

从 Qt 5.15 开始,添加了一项新功能:inline Components

顾名思义,它允许定义一个内联组件,具有以下优点:

You can create an instance of the component, without the overhead of using a Loader.
You can use the component type in property declarations.
You can refer to the component in other files than the one it is defined in.

Item {
.
.
.
component FavButtonLabelText: Text {
     property int aCustomProp: 0

     text: "Blah!"
     color: StyleSingleton.xNavPrimaryText
     font.family: StyleSingleton.xNavTextFont
     font.pointSize: 28
}
.
.
.      
FavButtonLabelText { text: "myNewText"; aCustomProp: 5 }