gpt4 book ai didi

qt - QML - 什么是 id 以及它是如何工作的?

转载 作者:行者123 更新时间:2023-12-04 12:50:39 24 4
gpt4 key购买 nike

考虑这个项目结构:

MyComponent.qml:

Item {
id: innerId
}

Usage.qml:

MyComponent {
id: outerId
}

乍一看,这似乎创建了一个同时具有 2 个不同 ID 的对象。但如果要将 id 视为属性,那是不可能的。

在我看来,id 与其说是对象的属性,不如说是对象声明的属性。是真的吗?

它将解释我如何在 MyComponent.qml 中将对象引用为 innerId 并在 Usage.qml 中引用为 outerId 但它在两个地方都是同一个对象。

最佳答案

id仅在该 qml 文件中可见。 id 不是一个属性,而是一个特殊的属性。不要被语法骗了,它只是为了符合 qml 的习惯用法,它可能看起来像一个属性,但它完全不同。

The id Attribute

Every QML object type has exactly one id attribute. This attribute is provided by the language itself, and cannot be redefined or overridden by any QML object type.

A value may be assigned to the id attribute of an object instance to allow that object to be identified and referred to by other objects. This id must begin with a lower-case letter or an underscore, and cannot contain characters other than letters, numbers and underscores.

从技术上讲,这两个 ID 可能看起来都引用同一个对象,但事实并非如此,innerId引用 Item MyComponent.qml 中的实例, 和 outerId引用 MyComponetn Usage.qml 中的实例.实际上,如果你console.log(id)来自 MyComponetnUsage您将获得相同的对象实例,因为 MyComponent {} instance 只是那个 Item 的另一个名字来自 MyComponent.qml .

id 不是一个属性,它只能从该文件内部访问,如果你需要暴露一些对象以便从外部可见,你需要这样做:

Item { // Something.qml
property Item innerItem : innerId
Item {
id: innerId
}
}

To me it seems that an id is not so much a property of an object as it is a property of an object declaration. Is that true?

id用于引用当前qml文件中某个qml类型的实例。如果通过“对象声明”你的意思是一个实例,那么是的,这是真的。 IMO“对象”是一个模棱两可的对象,因为一个对象可以是很多东西,一个对象可以是一个类型,一个实例,一个属性,一个函数,一个JS对象......在这方面我认为“每个QML对象type has exactly one id attribute”文档中的措辞不正确。

id 只适用于 qml 类型的实例,属性和函数以不同的方式工作,并且可以从外部访问。

如果你需要类比它的用途,id 可能被视为类似于私有(private)类成员的东西——它只在类型内部可见,如果你需要将它暴露给外部——你需要为它创建一个访问器。

it seems like this creates a single object that has 2 different id's simultaneously

这不是真的,因为您将无法解决 MyComponentinnerId ,所以不,它没有 2 个不同的 ID,它没有任何 ID。 id 并不真正属于该对象,它只是在当前源文件中关联到它。如上所述,这两个 id 将引用同一个对象,但该对象没有两个 id。

它的工作原理(我不是指实际实现)类似于 C++ 中的引用。您可以在不同的地方使用不同的名称对同一对象进行多次引用。在 qml 中,您不必像在 C++ 中那样为实例编写名称,但如果您想引用一个对象,通常的方法是使用 id,尽管根据对象树,您也可以使用父属性。不建议在大 qml 文件中过度使用 id,因为这会降低性能。

另外,请注意,与 id 不同,您可以非常多地“覆盖”函数和属性,并且这种行为有点不确定,如 this question 中所阐述的那样。 ,例如,如果你用字符串属性重写一个 int 属性,对象最终会拥有该属性两次,但如果你迭代对象,你将不会找到一个 int 和一个字符串,而是字符串两次。

关于qt - QML - 什么是 id 以及它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39356278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com