2

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

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

在 Loader 行,文本属性无效。在组件上定义属性或别名的尝试被拒绝,并显示“组件对象无法声明新属性”。

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

我怎样才能做到这一点?

4

3 回答 3

6

正如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
        }
    }
}
于 2017-06-01T07:53:55.893 回答
6

由于Loader将自身设置为正在加载的组件的上下文对象,因此您可以在其中定义一个属性并在加载的Item.
但是,您必须使用您的项目未使用的属性名称,否则它将被您的项目自己的属性所掩盖,并且没有简单的方法可以显式访问上下文属性。

Component {
    id: favButtonLabelText
    Text {
        text: foobar
    }
}
Loader {
    sourceComponent: favButtonLabelText
    property string foobar: "Diameter"
}
于 2017-06-01T07:30:37.867 回答
2

从 Qt 5.15 开始,添加了一个新特性:内联组件

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

您可以创建组件的实例,而无需使用 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 }
于 2021-04-30T10:18:12.640 回答