有没有办法在 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 文件之外添加的其他项目将放置在子列表中的此项之后。