【问题标题】:QML: Component vs Item as a containerQML:组件与项作为容器
【发布时间】:2015-10-28 01:52:12
【问题描述】:

QML 中的ComponentItem 有什么区别?这里的文档不是很清楚。 用作多个小部件的容器的首选类型是什么? 可以换成Rectangle吗?

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

Item {
    id: itemWidget

    Rectangle { id: one }
    Rectangle { id: two }
}

Component {
    id: componentWidget

    Rectangle { id: one }
    Rectangle { id: two }
}

为什么我们通常在声明delegate时使用Component

【问题讨论】:

  • 您对文档有什么不了解的地方?如果你不说为什么他们不清楚,他们就无法改进。我认为他们很清楚,你在这里得到的任何答案很可能是对已经存在的内容的重新措辞。
  • 我同意@Mitch 的观点,Qt 文档是我见过的最好的文档,所以如果你发现不清楚,我想你不会在这里找到任何帮助。
  • 在问题描述中添加了一些示例

标签: qt delegates qml qtquick2 qqmlcomponent


【解决方案1】:

这两个sn-ps的区别在于Rectangle会立即显示出来。这是写在documentation

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

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

【讨论】:

    【解决方案2】:

    Component 在 QML 中既是概念又是事物。 Item 是在 QtQuick 模块中定义的视觉对象,可在 QML 中使用。这两件事在概念上是不同的。

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

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

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

    我认为将Item 称为Component 是可以的,即使Item 在技术上不是从Component 继承的。或者更准确地说,如果您的.qml 具有Item 作为根类型,您可以说您的自定义组件基于Item

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 2013-03-27
      • 2018-05-17
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多