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

时间:2017-05-31 20:51:11

标签: qml qqmlcomponent

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

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属性是类似的。

我该怎么做?

3 个答案:

答案 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 }