如何创建分组/嵌套属性?

时间:2015-01-27 11:42:09

标签: qt qml qt5 qt-quick qtquick2

我正在尝试使用' font.family'等嵌套属性。或者' anchors.fill',但是我无法以正常方式初始化它们,因为它打印了“无法分配给不存在的属性”#。相反,我被迫使用Component.onCompleted方法。怎么了?

MyButtonStyling.qml:

import QtQml 2.1

QtObject
{
    property QtObject background: QtObject
    {
        property color pressed: "#CCCCCC"
        property color enabled: "#666666"
        property color disabled: "#555555"
    }
}

main.qml:

import QtQuick 2.0

Item
{
    width: 400
    height: 300
    MyButton
    {
        text: "TEST"
        styling: MyButtonStyling
        {
            //background.enabled: "#1B2E0A" //Cannot assign to non-existent property "enabled"
            Component.onCompleted:
            {
                background.enabled = "#1B2E0A" //Works
            }
        }
    }
}

MyButton.qml:

import QtQuick 2.0
import QtQuick.Controls 1.0
import QtQuick.Controls.Styles 1.0

Button
{
    property QtObject styling: MyButtonStyling {}

    implicitWidth: 80
    implicitHeight: 80

    style: ButtonStyle
    {
        background: Item
        {
            Rectangle
            {
                anchors.fill: parent
                color: control.pressed ? styling.background.pressed : control.enabled ? styling.background.enabled : styling.background.disabled
            }
        }
    }
}

3 个答案:

答案 0 :(得分:12)

尝试用QML文件替换嵌套的QtObject。例如,我将其替换为BackgroundTheme.qml。这样,属性(可以正确地称为"分组属性")在绑定中正常工作,没有任何错误。

BackgroundTheme.qml

import QtQuick 2.0

QtObject {
  property color pressed: "#CCCCCC"
  property color enabled: "#666666"
  property color disabled: "#555555"
}

MyButtonStyling.qml

import QtQuick 2.0

QtObject {       
    property BackgroundTheme background: BackgroundTheme {}
}

答案 1 :(得分:1)

要添加到问题的什么地方部分。

您的方法无效,因为左侧的表达式在QML中是静态键入的

我遇到了同样的问题,发现this comment by Matthew Vogt出现在QT错误报告中:

  

此行为目前是正确的。

     

QML是为左侧表达式静态类型化的,因​​此无法在初始化时解析属性的静态类型中不存在的动态属性。

     

此问题的解决方法是将要初始化的类型的声明移到其自己的文件中,以便可以将其声明为具有正确静态类型的属性。

previous comment就是一个很好的例子:

  

此错误与别名的使用没有特别关系-它是由在不同单元中进行编译期间的属性查找导致的。   一个简单的例子:

Base.qml

import QtQuick 2.0

Item {
    property QtObject foo: Image {
        property color fg: "red"
    }

    property color bar: foo.fg
}

main.qml

import QtQuick 2.0

Base {
    foo.fg: "green"
}
  

此处,“ foo”具有静态类型“ QtObject”和动态类型“ QQuickImage_QML_1”。在Base.qml中的“ bar”初始化中,对“ fg”的查找成功,但在main.qml中的查找失败。

答案 2 :(得分:1)

这可能不是正确的方法。但这有效

MyButtonStyling.qml

import QtQml 2.1

QtObject
{
    property alias background: _obj_background

    QtObject 
    {
        id: _obj_background
        property color pressed: "#CCCCCC"
        property color enabled: "#666666"
        property color disabled: "#555555"
    }
}

现在可以在main.qml中使用background.enabled: "#1B2E0A"