QML属性为null

QML属性为null,qml,qt5,Qml,Qt5,我试图在可重用的QML组件中定义一个具有默认值的属性。以下是我迄今为止的代码: property alias value: progressBar.value property bool error: false property ProgressBarStyle errorStyle: ProgressBarStyle { background: Rectangle { radius: 2 color: "lightgray" borde

我试图在可重用的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
,并将其设置为
progressBar
style
。我知道
errorStyle
可以工作,因为如果我直接在
progressBar
上设置它,它就可以工作。据我所知,当我运行程序时,问题是
errorStyle
null

更新:

也许更好的回答这个问题的方式是:“我如何绕过‘PropertyChanges不支持创建特定于状态的对象’。如果我直接在PropertyChanges数组中创建样式,会收到错误消息

更新2:


我基本上放弃了这种方法,决定尝试使用样式。这引出了另一个问题:

您可以尝试使用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
}
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
        }
    }
}
但是我将采取的方法是创建属性颜色和边框颜色,并更改样式的矩形颜色,而不是完全更改样式

像这样:

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

使用组件和id无效,同样的问题。我想替换整个样式对象的原因是,在Mac上,默认的进度条样式是系统定义的,而且据我所知,是不透明的,因此我无法更改颜色,因此我想在出现错误情况时更改整个样式。那么,按照我在第二个解决方案中的建议更改颜色呢?正如我所说,OSX上的进度条默认是由系统定义的(例如,它是动画的),根据我所知,不是简单的样式,所以我不能仅仅更改颜色。我指的是ProgressBarStyle矩形背景和进度的颜色。不要告诉我它不起作用,因为我知道它起作用,我测试了它。它起作用,但它不起我想要的作用。问题是默认情况下,在OSX上我会得到一个漂亮的蓝色动画进度条——我没有指定样式。虽然我可以像你建议的那样指定样式和切换颜色,但我会丢失动画进度条。