有没有办法为某些/所有“sub”-Items设置属性/属性?

时间:2016-04-25 18:18:22

标签: qt qml qt5

我有一个带有二十个按钮的QML Pane,我想设置他们的标签anchors.horizontalCenteranchors.verticalCentersourceSize.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
        }
    }
    // ...
}

1 个答案:

答案 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都会有机会。