我正在尝试并且看似简单的事情:在内联定义一个简单的文本格式化组件,然后使用不同的文本多次实例化它。这是代码
Item {
.
.
.
Component {
id: favButtonLabelText
Text {
text: "Blah!"
color: StyleSingleton.xNavPrimaryText
font.family: StyleSingleton.xNavTextFont
font.pointSize: 28
}
}
.
.
.
Loader { sourceComponent: favButtonLabelText; text: "Diameter" }
在Loader行,text属性无效。尝试在组件上定义属性或别名将被拒绝,“组件对象无法声明新属性”。
我在文档中找到的唯一示例显示了覆盖内联组件中定义的x
的{{1}}属性。在我看来,覆盖Rectangle
元素的text
属性是类似的。
我该怎么做?
答案 0 :(得分:3)
由于Loader
将自身设置为要加载的组件的上下文对象,因此您可以在其中定义属性并在加载的Item
中使用它。
但是,您必须使用项目未使用的属性名称,否则它将被项目自己的属性遮蔽,并且没有明确的方法来显式访问上下文属性。
Component {
id: favButtonLabelText
Text {
text: foobar
}
}
Loader {
sourceComponent: favButtonLabelText
property string foobar: "Diameter"
}
答案 1 :(得分:3)
正如 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
}
}
}
答案 2 :(得分:2)
从 Qt 5.15 开始,添加了一项新功能:inline Components
顾名思义,它允许定义一个内联组件,具有以下好处:
<块引用>您可以创建组件的实例,而无需使用 Loader。
您可以在属性声明中使用组件类型。
您可以在其他文件中引用组件,而不是在其中定义的文件。
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 }