有没有办法在 QML 中区分内部定义的 children 和外部定义的?
Is there a way to distinguish internally defined children from externally defined ones in QML?
我定义了一个 MyElement
元素(在 MyElement.qml 文件中)如下:
Rectangle {
Item {
}
Component.onCompleted: {
console.warn(children.length)
}
}
我们将 MyElement
中定义的 Item
元素称为 内部 child。现在,我按以下方式使用 MyElement
元素:
MyElement {
Item {
}
}
这里使用另一个 Item
元素作为 MyElement
的 child。我们将此 Item
元素称为 外部 child。要理解我下面的问题,应该清楚地了解内部和外部之间的区别 children.
当前代码的输出将是 2,即两个 Item
元素计算为 children.
将来我想在块 Component.onCompleted
中迭代仅在外部 children 上,而不是在内部(外部 children 在内部之后)。但是为此,我必须知道我必须从中开始的 children 索引(在给定的示例中,该索引是 1)。有没有办法得到这个索引,或者换句话说,内部children的数量?谢谢。
Qt 中没有内部机制来区分内部子项和在自己的 QML 定义之外定义的子项。
我的解决方法如下
//MyElement.qml
Rectangle {
id: root
readonly property Item last_item: lastone
Item {
id: someitem
}
Item {
id: lastone
}
Component.onCompleted: {
var external_started = false;
for(var i = 0 ; i < root.children.length ; ++i)
{
if(external_started)
console.log(root.children[i].toString(), 'is external');
else if(root.children[i]===last_item)
external_started = true;
}
}
}
和
MyElement {
Item {
objectName: 'I am external'
}
}
这是一个 dirty hack 但它有效。
我在名为 last_item
的只读 属性 中保存对最后一项的引用,这将在 qml 定义中区分我的最后一项。
在 qml 文件之外添加的其他项目将放置在子列表中的此项之后。
我定义了一个 MyElement
元素(在 MyElement.qml 文件中)如下:
Rectangle {
Item {
}
Component.onCompleted: {
console.warn(children.length)
}
}
我们将 MyElement
中定义的 Item
元素称为 内部 child。现在,我按以下方式使用 MyElement
元素:
MyElement {
Item {
}
}
这里使用另一个 Item
元素作为 MyElement
的 child。我们将此 Item
元素称为 外部 child。要理解我下面的问题,应该清楚地了解内部和外部之间的区别 children.
当前代码的输出将是 2,即两个 Item
元素计算为 children.
将来我想在块 Component.onCompleted
中迭代仅在外部 children 上,而不是在内部(外部 children 在内部之后)。但是为此,我必须知道我必须从中开始的 children 索引(在给定的示例中,该索引是 1)。有没有办法得到这个索引,或者换句话说,内部children的数量?谢谢。
Qt 中没有内部机制来区分内部子项和在自己的 QML 定义之外定义的子项。 我的解决方法如下
//MyElement.qml
Rectangle {
id: root
readonly property Item last_item: lastone
Item {
id: someitem
}
Item {
id: lastone
}
Component.onCompleted: {
var external_started = false;
for(var i = 0 ; i < root.children.length ; ++i)
{
if(external_started)
console.log(root.children[i].toString(), 'is external');
else if(root.children[i]===last_item)
external_started = true;
}
}
}
和
MyElement {
Item {
objectName: 'I am external'
}
}
这是一个 dirty hack 但它有效。
我在名为 last_item
的只读 属性 中保存对最后一项的引用,这将在 qml 定义中区分我的最后一项。
在 qml 文件之外添加的其他项目将放置在子列表中的此项之后。