如何定义内联 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" 拒绝。
我在文档中找到的唯一示例显示了覆盖在内联组件中定义的 Rectangle
的 x
属性。在我看来,覆盖 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 }
我正在尝试做一些看似简单的事情,但失败了:定义一个简单的内联文本格式组件,然后用不同的文本多次实例化它。这是代码
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" 拒绝。
我在文档中找到的唯一示例显示了覆盖在内联组件中定义的 Rectangle
的 x
属性。在我看来,覆盖 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 }