QML:Component vs Item作为容器

Dmi*_*try 21 qt delegates qml qtquick2 qqmlcomponent

ComponentItemQML有什么区别?这里的文档并不完全清楚.用作多个小部件的容器的首选类型是什么?可以替换Rectangle吗?

例如,以下声明的区别是什么:

Item {
    id: itemWidget

    Rectangle { id: one }
    Rectangle { id: two }
}
Run Code Online (Sandbox Code Playgroud)

Component {
    id: componentWidget

    Rectangle { id: one }
    Rectangle { id: two }
}
Run Code Online (Sandbox Code Playgroud)

为什么我们通常Component在宣布时使用delegate

Mit*_*tch 15

这两个片段之间的区别在于Rectangle会立即显示.这写在文档中:

请注意,虽然Rectangle本身会自动渲染和显示,但上面的矩形不是这种情况,因为它是在Component中定义的.该组件将QML类型封装在其中,就好像它们是在单独的QML文件中定义的那样,并且在请求之前不会加载(在这种情况下,由两个Loader对象加载).因为Component不是从Item派生的,所以您无法锚定任何东西.

使用声明委托时,Component因为必须创建多个委托项.单曲Item在这里不起作用.您可以将其Component视为可以从中创建对象的模板.


Yas*_*oji 5

AComponent在 QML 中既是概念又是事物。AnItem是在 QtQuick 模块中定义的可视化事物,可在 QML 中使用。这两件事在概念上是不同的。

作为 QML 的概念,所有可重用的东西都称为组件。您可以通过多种方式定义组件,但一种简单的方法是创建一个.qml文件并按照您命名组件的方式命名。即:Button.qml 或 Switch.qml。当 QML 引擎加载该文件时,您可以将其用作按钮或开关。

定义组件的另一种方法是Component {}.qml文件中使用。这允许您定义一个新的内联组件。内联定义的组件在由loader显式加载后不起作用。

Item另一方面,An是 QtQuick 模块中定义的简单类型。

我认为这是确定调用Item一个Component即使在Item没有从技术上继承Component。或者更准确地说,你可以说你的自定义组件是基于一个Item,如果你.qmlItem一个根类型。