qml中ID的机制
qml中的id一般都是组件内访问的,但实际上qml采用了“动态作用域”的策略,qml中的id实际上是全局的,因此创建的对象是全局访问的。
问题来了
如果我此时创建几个id为id_root的对象,id_root下的所有子对象访问的是哪个id_root,为了试验这个问题。写了如下的qml。
创建一个Spectrum.qml文件,里面有child1,child1里有child2,child2里有一个combobox访问Spectrum.qml的id
Spectrum.qml
import QtQuick 2.0
Rectangle {
id:id_root
color: "pink"
width: 200
height: 200
Child1{
anchors.centerIn: parent
}
}
Child1.qml
import QtQuick 2.0
Rectangle {
border.width: 2
width: 150
height: 150
Child2{
anchors.centerIn: parent
}
}
Child2.qml
import QtQuick 2.0
import QtQuick.Controls 2.14
Rectangle {
border.width: 2
width: 100
height: 100
ComboBox{
width: 80
anchors.centerIn: parent
model: ["pink","green","blue","orange","yellow"]
onCurrentTextChanged: {
id_root.color = currentText
}
}
}
main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
Window {
visible: true
width: 850
height: 480
title: qsTr("Hello World")
Repeater{
model: 4
Spectrum{
x:index * 210
y:10
}
}
}
运行结果:
总结
qml中的id是全局访问的,当存在多个同名Id的时候,qml访问的是对象树中层级最近的那个变量,从子级往父级找id,直到找到最近的id的为止。局部变量覆盖其他的同名id的对象访问也是如此。
以上就是今天要讲的内容。求求大家点赞收藏呀!