当我在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
可用,我认为这样会很好。
有没有办法(可能会破解这个)?
答案 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
,适用于anchors
或width
和height
等内容。