E.g。是否保证子项的初始化顺序与它们在源代码中出现的顺序相匹配?
注意:通过"初始化孩子"我的意思是"孩子及其所有孩子,后代,绑定等的初始化"。
答案 0 :(得分:2)
可以使用简单的测试来验证对象创建的顺序。
class Test : public QQuickItem {
Q_OBJECT
public:
Test(QQuickItem * p = 0) : QQuickItem(p) { qDebug() << this; }
};
然后:
Test {
objectName: "a"
Component.onCompleted: console.log(objectName, this)
Test {
objectName: "b"
Component.onCompleted: console.log(objectName, this)
Test {
objectName: "c"
Component.onCompleted: console.log(objectName, this)
}
Test {
objectName: "d"
Component.onCompleted: console.log(objectName, this)
}
}
Test {
objectName: "e"
Component.onCompleted: console.log(objectName, this)
}
}
这给出了输出:
Test(0x6a7378, parent=0x0, geometry=0,0 0x0)
Test(0x6a73d8, parent=0x0, geometry=0,0 0x0)
Test(0x6a7438, parent=0x0, geometry=0,0 0x0)
Test(0x6a7498, parent=0x0, geometry=0,0 0x0)
Test(0x6a74f8, parent=0x0, geometry=0,0 0x0)
qml: a Test(0x6a7378, "a")
qml: e Test(0x6a74f8, "e")
qml: b Test(0x6a73d8, "b")
qml: d Test(0x6a7498, "d")
qml: c Test(0x6a7438, "c")
这表明对象构造函数确实被称为从下到上。
另请注意,onCompleted
的顺序不同,具体取决于安装处理程序的位置。如果你将Test
包裹在这样的Obj.qml
中:
Test {
id: rectangle
Component.onCompleted: console.log(objectName, this)
}
并声明这样的结构:
Obj {
objectName: "a"
Obj {
objectName: "b"
Obj {
objectName: "c"
}
Obj {
objectName: "d"
}
}
Obj {
objectName: "e"
}
}
然后你得到一致的&#34;回到前面&#34;您在第一个场景中没有得到的输出:
Test(0x4b2458, parent=0x0, geometry=0,0 0x0)
Test(0x4b24b8, parent=0x0, geometry=0,0 0x0)
Test(0x4b2518, parent=0x0, geometry=0,0 0x0)
Test(0x4b2578, parent=0x0, geometry=0,0 0x0)
Test(0x50f9d68, parent=0x0, geometry=0,0 0x0)
qml: e Test(0x50f9d68, "e")
qml: d Test(0x4b2578, "d")
qml: c Test(0x4b2518, "c")
qml: b Test(0x4b24b8, "b")
qml: a Test(0x4b2458, "a")
然而,所有这些都反映了对象创建的顺序,而不是对象完成,它涉及一堆其他东西,可以按任意顺序执行,具体取决于绑定表达式结构。
简而言之,你不应该依赖于那个顺序,如果你这样做,你做错了。你不应该依赖任何比整个QML源代码树完成更精细的东西,qtquick引擎本身将注意延迟初始化的绑定表达式等等,直到整个对象树完成,所以你赢了&# 39;有问题,它会自动发生,但依赖于较低级别和更细粒度的任何东西都是设计中的潜在缺陷并且应该避免。给出你的对象id,并为整个qml文件执行一个单独的初始化表达式,如果你想要更明确的初始化顺序,那么它就会把东西连接在一起。该表达式中的语句将按其定义的顺序执行。