我有一个带有二十个按钮的QML Pane
,我想设置他们的标签anchors.horizontalCenter
,anchors.verticalCenter
和sourceSize.width
属性(属性? )在一个地方。这可能吗?
换句话说,我想做这样的事情:
Pane {
AllButtons: SetThoseProperties {
label.sourceSize.width: 32
label.anchors.horizontalCenter: parent.horizontalCenter
label.anchors.verticalCenter: parent.verticalCenter
}
Button {
id: button1
// maybe some reference to the AllButtons thing?
label: Image {
source: "qrc:/image1.svg"
}
}
Button {
id: button1
// maybe some reference to the AllButtons thing?
label: Image {
source: "qrc:/image1.svg"
}
}
// ...
}
而不是:
Pane {
AllButtons: SetThoseProperties {
label.sourceSize.width: 32
label.anchors.horizontalCenter: parent.horizontalCenter
label.anchors.verticalCenter: parent.verticalCenter
}
Button {
id: button1
// maybe some reference to the AllButtons thing?
label: Image {
source: "qrc:/image1.svg"
sourceSize.width: 20
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
}
}
Button {
id: button2
// maybe some reference to the AllButtons thing?
label: Image {
source: "qrc:/image2.svg"
sourceSize.width: 20
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
}
}
// ...
}
答案 0 :(得分:3)
创建一个新的QML组件及其预定义属性,然后您可以将其用作独立类型。
您可以通过右键单击现有对象并从重构 - >>轻松完成此操作。将组件移动到单独的文件中。
// CustomButton.qml
Button {
property alias image: bImage.source
label: Image {
id: bImage
source: "qrc:/image2.svg"
sourceSize.width: 20
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
}
}
然后你就可以使用它:
CustomButton {
image: "qrc:/image2.svg"
}
此外,您可以利用转发器:
Column {
Repeater {
model: 10
CustomButton {
image: "qrc:/image" + index + ".svg"
onClicked: foos[index]()
}
}
}
这将为您提供一列10个按钮,每个按钮的图像源对应于其索引。您可以将每个按钮的功能分配给一组函数。
使用转发器,您还可以避免使用额外的CustomButton.qml
类型,转发器将重复其体内的任何对象,因此您可以定义对象的属性一次,这些属性将应用于所有实例。
如果指定ListModel
,您可以更进一步,那么除了索引之外,您还可以为每个模型项目提供唯一的自定义属性。
最后,如果您想轻松覆盖多个对象的属性,而不是直接引用属性值,请使用另一个属性作为代理:
// for example in main.qml
property int imageWidth: 20
// CustomButton.qml
...
sourceSize.width: imageWidth
...
这样一来,改变imageWidth
每个引用它的sourceSize.width
都会有机会。