在QML组件中将父上下文与父项分开设置

时间:2017-03-16 13:53:11

标签: qt qml qtquick2

当我在QML中定义Component时,我可以定义alias property以公开QtObjects根隐藏的Components属性。

特别有趣的是default property alias可以构建强大的可重用和适应性Components。但是没有通用的方法来改变nameresolution,这对于属性和信号都是不好的。

示例:MyComp1.qml

Item {
    id: rootItem
    default property alias content: childItem.data
    signal sig()

    Item {
        id: childItem
    }
}

main.qml

MyComp {
    id: myObj
    signal sig1()
    onSig1: console.log('here')
    Button {
        id: button
        onClicked: {
            parent.sig()
            parent.sig1()
        }
    }
}

此处button现在是childItem的孩子,但两个信号:sig()sig1()都在rootItem中定义,这会导致错误。对于我精心设计的Component的用户而言,它并不透明。他需要查看Component的代码才能意识到为什么父按钮不是myObj/rootItem而是childItem。这可能会导致错误。

因此,我正在寻找一种方法来防止它 对于信号sig(),可以通过修改MyComp并手动将信号从childItem转发到rootItem来实现:

Item {
    id: rootItem
    default property alias content: childItem.data
    signal sig()
    Item {
        id: childItem
        signal sig()
        onSig: rootItem.sig()
    }
}

但有没有办法快捷方式这样,以便用户不需要我们myObj.sig1(),但可能会使用parent.sig1()

同样适用于实例化添加的属性:

MyComp {
    signal sig1()
    property int num: 5
    Button {
        text: parent.num // <--- Error
    }
}

如果属性和信号定义的实例化对于由parent.propertyName - 属性添加的对象default可用,我认为这样会很好。 有没有办法(可能会破解这个)?

1 个答案:

答案 0 :(得分:0)

没有办法做到这一点。

你能做的就是停止假设QML代码中的外部范围始终是父范围。

您可以通过ID:

直接访问它
MyComp {
    id: myComp
    signal sig1()
    property int num: 5
    Button {
        text: myComp.num
        onClicked: myComp.sig1()
    }
}

或者,如果您要访问的对象是根项目,则可以隐含地访问其属性:

MyComp {
    signal sig1()
    property int num: 5
    Button {
        text: num
        onClicked: sig1()
    }
}

可以从这种情况推断出的一个好习惯(尽管可能对于大多数情况来说可能太极端),只是在您真正想要访问可视层次结构中的父parent时才使用Item,适用于anchorswidthheight等内容。