【问题标题】:What is the difference between a QML component and a QML object type?QML 组件和 QML 对象类型有什么区别?
【发布时间】:2018-04-21 15:10:10
【问题描述】:

Qt's doc,说:

组件是可重用的封装 QML 类型,具有良好定义 接口。

组件通常由组件文件定义 - 即 .qml 文件。 Component 类型本质上允许定义 QML 组件 内联,在 QML 文档中,而不是作为单独的 QML 文件。

具有良好定义接口的封装 QML 类型”是什么意思

当涉及到定义一个新的 QML 对象类型时,从 Qt's doc 我们有:

要创建对象类型,应将 QML 文档放入文本 名为 TypeName.qml 的文件,其中 TypeName 是所需的名称 类型

那么 QML 组件和 QML 对象类型有什么区别呢?

谢谢。

【问题讨论】:

    标签: c++ qt qml


    【解决方案1】:

    this 文档中,他们将 custom 对象称为组件。

    组件是具有良好定义接口的可重用类型,完全使用 QML 构建。任何 QML 代码的 sn-p 都可以成为一个组件,方法是将代码放在一个文件“.qml”中,其中是新组件的名称,以大写字母开头。这些 QML 文件会自动作为新的 QML 元素(对象)类型提供给同一目录中的其他 QML 组件和应用程序。

    自定义对象类型和组件是一样的,但是像矩形这样的对象不是组件。 每当您使用 TypeName.qml 文件创建自定义对象时,engin 都会将 TypeName.qml 文档作为组件加载。

    我们有两种组件:

    1. 由组件文件定义 - 即 .qml 文件。所以我们可以说这种组件与qml文档相同。
    2. Component 类型本质上允许在 QML 文档中内联定义 QML 组件,而不是作为单独的 QML 文件。

    this 文件中他们说:

    文档定义的对象类型的实例可以使用 QML 代码中的 Component 或 C++ 中的 QQmlComponent 创建。或者,如果对象类型以特定类型名称显式暴露给 QML 类型系统,则该类型可以直接用于其他文档的对象声明中。

    因此,如果您创建自定义对象类型,您实际上会创建一个组件,反之亦然。

    【讨论】:

      【解决方案2】:

      “具有良好定义接口的封装 QML 类型”是什么意思?

      对我来说,封装部分意味着组件中包含的 QML 是自包含的,因此可以重用。定义明确的部分意味着外部代码只能访问组件根对象中定义的属性,类似于在 C++ 中使用 protectedprivate 关键字的方式。

      那么 QML 组件和 QML 对象类型有什么区别呢?

      我对文档内容的理解是,声明为内联的组件不能以相同的方式实例化 [1]。例如:

      Component {
          id: myComponent
      
          Text {
              text: "Hello"
          }
      }
      

      您可以使用myComponent 作为例如一个代表:

      ListView {
          // ...
          delegate: myComponent
      }
      

      但是不能用它直接实例化它所代表的类型:

      myComponent {
          // ...
      }
      

      这就是为什么您需要将组件移动到它自己的文件中(“QML 对象类型”):

      import QtQuick 2.0
      
      Text {
          text: "Hello"
      }
      

      假设您将文件命名为 MyType.qml,您可以像这样直接实例化类型:

      MyType {
          text: "Some text"
      }
      

      [1] 从 Qt 5.15 开始,可以内联实例化组件。一旦 5.15 发布,请参阅 this section

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-17
        • 2014-02-19
        • 2021-06-04
        • 2014-03-22
        • 1970-01-01
        • 2011-11-15
        • 2013-11-10
        • 2021-03-10
        相关资源
        最近更新 更多