我正在尝试和失败,并且在看似简单的事情上失败:定义简单的文本格式格式组件内联,然后用不同的文本多次实例化。这是代码
Item {
.
.
.
Component {
id: favButtonLabelText
Text {
text: "Blah!"
color: StyleSingleton.xNavPrimaryText
font.family: StyleSingleton.xNavTextFont
font.pointSize: 28
}
}
.
.
.
Loader { sourceComponent: favButtonLabelText; text: "Diameter" }
在加载程序线上,文本属性无效。尝试在组件上定义属性或别名的尝试被"组件对象无法声明新属性"拒绝。
我在文档中找到的唯一示例,显示了在内联组件中定义的Rectangle
的x
属性。在我看来,Text
元素的text
属性是类似的。
我该怎么做?
从QT 5.15开始,添加了一个新功能:内联组件
顾名思义,它允许定义组件内联,其优点为:
您可以创建组件的实例,而无需使用加载程序的开销。
。
您可以使用属性声明中的组件类型。
您可以参考其他文件中的组件。
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 }
因为 Loader
将自己设置为已加载的组件的上下文对象,您可以在其中定义属性并在加载的Item
中使用它。
但是,您必须使用项目未使用的属性名称,否则它将被您的物品自己的属性所掩盖,并且没有简单的方法可以明确访问上下文属性。
Component {
id: favButtonLabelText
Text {
text: foobar
}
}
Loader {
sourceComponent: favButtonLabelText
property string foobar: "Diameter"
}
AS 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
}
}
}