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



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

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

在加载程序线上,文本属性无效。尝试在组件上定义属性或别名的尝试被"组件对象无法声明新属性"拒绝。

我在文档中找到的唯一示例,显示了在内联组件中定义的Rectanglex属性。在我看来,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
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新