【问题标题】:QML property is nullQML 属性为空
【发布时间】:2014-04-22 12:35:08
【问题描述】:

我正在尝试在可重用的 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被构造并设置为progressBarstyle。我知道errorStyle 可以工作,因为如果我直接在progressBar 上设置它就可以工作。据我所知,当我运行我的程序时,问题是errorStylenull

更新:

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

更新 2:

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

【问题讨论】:

    标签: qml qt5


    【解决方案1】:

    您可以尝试使用 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
            }
        }
    }
    

    【讨论】:

    • 使用组件和 id 不起作用,同样的问题。我想替换整个样式对象的原因是在Mac上,默认进度条样式是系统定义的,据我所知,不透明,所以我不能改变颜色,所以我想在那里改变整个样式是一个错误条件。
    • 那么按照我在第二个解决方案中的建议更改颜色呢?
    • 就像我说的,OSX 上的进度条默认是系统定义的(例如,它是动画的),据我所知不是简单的样式,所以我不能只改变颜色.
    • 我的意思是 ProgressBarStyle Rectangle 背景和进度的颜色。不要告诉我它确实有效,因为我知道它有效,我测试过它。
    • 这行得通,但它不符合我的要求。问题是默认情况下,在 OSX 上我得到一个漂亮的蓝色动画进度条——我没有指定样式。虽然我可以按照您的建议指定样式和切换颜色,但我会丢失动画进度条。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多