QML属性为null

时间:2014-04-16 22:14:27

标签: qml qt5

我试图在可重复使用的QML组件中定义具有默认值的属性。到目前为止,这是我的代码:

property alias value: progressBar.value
property bool error: false
property ProgressBarStyle errorStyle: ProgressBarStyle {
    background: Rectangle {
        radius: 2
        color: "lightgray"
        border.color: "gray"
        border.width: 1
        implicitWidth: 200
        implicitHeight: 24
    }
    progress: Rectangle {
        color: "orangered"
        border.color: "red"
    }
}

Layout.fillWidth: true

ProgressBar {
    id: progressBar
    Layout.fillWidth: true
    minimumValue: 0.0
    maximumValue: 100.0
    style: errorStyle
}

因此构思errorStyle并将其设置为style的{​​{1}}。我知道progressBar有效,因为如果我直接在errorStyle设置它就可以了。据我所知,当我运行程序时,progressBar的问题是errorStyle

更新:

提出这个问题的一个更好的方法是:"我如何绕过' PropertyChanges不支持创建特定于州的对象。'如果我直接在PropertyChanges数组中创建样式,我会收到错误消息吗?

更新2:

我基本放弃了这种方法并决定尝试使用样式代替。这导致了另一个问题:Cannot create certain QML types in a singleton

1 个答案:

答案 0 :(得分:0)

您可以尝试使用id声明它,并使用id。因此,不要将其作为财产来确定,而是将其作为一个组件。像这样:

ProgressBarStyle {
    id: errorStyle
    background: Rectangle {
        radius: 2
        color: "lightgray"
        border.color: "gray"
        border.width: 1
        implicitWidth: 200
        implicitHeight: 24
    }
    progress: Rectangle {
        color: "orangered"
        border.color: "red"
    }
}

ProgressBar {
    id: progressBar
    Layout.fillWidth: true
    minimumValue: 0.0
    maximumValue: 100.0
    style: errorStyle
}

但我采取的方法是制作属性颜色和bordercolor,并改变样式的矩形颜色,而不是完全改变样式。

像这样:

property Color barColor
property Color barBorderColor
property Color progressColor
property Color progressBorderColor

ProgressBar {
    id: progressBar
    Layout.fillWidth: true
    minimumValue: 0.0
    maximumValue: 100.0
    style: ProgressBarStyle {
        background: Rectangle {
            radius: 2
            color: barColor
            border.color: barBorderColor
            border.width: 1
            implicitWidth: 200
            implicitHeight: 24
        }
        progress: Rectangle {
            color: progressColor
            border.color: progressBorderColor
        }
    }
}