Component QML Type

封装 QML 组件定义。更多

Import Statement: import QtQml
In C++: QQmlComponent

属性

附加信号

方法

详细说明

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

组件通常由组件文件(即.qml 文件)定义。组件类型基本上允许 QML 组件在QML 文档中内嵌定义,而不是作为单独的 QML 文件。这对于在一个 QML 文件中重复使用一个小组件,或定义一个在逻辑上属于文件中其他 QML 组件的组件,可能很有用。

例如,这里有一个被多个Loader 对象使用的组件。它包含一个单独的项目,即Rectangle

import QtQuick

Item {
    width: 100; height: 100

    Component {
        id: redSquare

        Rectangle {
            color: "red"
            width: 10
            height: 10
        }
    }

    Loader { sourceComponent: redSquare }
    Loader { sourceComponent: redSquare; x: 20 }
}

请注意,虽然Rectangle 本身会自动渲染和显示,但上面的矩形并非如此,因为它是在Component 中定义的。该组件封装了其中的 QML 类型,就像它们是在一个单独的 QML 文件中定义的一样,而且直到被请求(在本例中,被两个Loader 对象请求)时才会加载。因为 Component 不是从 Item 派生的,所以不能锚定任何东西。

定义Component 与定义QML 文档类似。一个 QML 文档有一个顶级项,它定义了该组件的行为和属性,并且不能在该顶级项之外定义属性或行为。同样,一个Component 定义包含一个顶层项(上例中为Rectangle ),除了id(上例中为redSquare)外,不能定义该顶层项之外的任何数据。

Component 类型通常用于为视图提供图形组件。例如,ListView::delegate 属性需要Component 来指定每个列表项的显示方式。

Component 对象也可以使用 () 动态创建。Qt.createComponent

Component在声明类型时,如果只需要该类型的一个实例,而无需添加整个新文件,则可以使用 () 来创建对象。但是,您不能为这种类型命名,因此不能用它来声明属性或在类型注解中使用它。如果需要,最好使用内联组件

创建上下文

组件的创建上下文与组件的声明上下文相对应。当该组件被ListView 或 Loader 等对象实例化时,该上下文将被用作父上下文(创建上下文层次结构)。

在下面的示例中,comp1 是在 MyItem.qml 的根上下文中创建的,从该组件实例化的任何对象都可以访问该上下文中的 id 和属性,如internalSettings.color 。当comp1 在另一个上下文(如下面的 main.qml)中作为ListView 委托使用时,它将继续访问其创建上下文中的属性(否则外部用户将无法访问这些属性)。

MyItem.qml
Item {
    property Component mycomponent: comp1

    QtObject {
        id: internalSettings
        property color color: "green"
    }

    Component {
        id: comp1
        Rectangle { color: internalSettings.color; width: 400; height: 50 }
    }
}
main.qml
ListView {
    width: 400; height: 400
    model: 5
    delegate: myItem.mycomponent    //will create green Rectangles

    MyItem { id: myItem }
}

创建上下文的生命周期必须长于任何已创建对象的生命周期。有关详细信息,请参阅维护动态创建的对象

属性文档

progress : real [read-only]

加载组件的进度,从 0.0(未加载)到 1.0(已完成)。


status : enumeration [read-only]

该属性显示组件加载的状态。状态可以是以下其中之一:

常量说明
Component.Null组件无数据
Component.Ready组件已加载,可用于创建实例。
Component.Loading正在加载组件
Component.Error加载组件时发生错误。调用errorString() 将提供关于任何错误的可读描述。

url : url [read-only]

组件 URL。这是用于构建组件的 URL。


附加信号文档

completed()

对象实例化后发出的信号。一旦建立了完整的 QML 环境,它就可用于在启动时执行脚本代码。

onCompleted 信号处理程序可在任何对象上声明。处理程序的运行顺序未定义。

Rectangle {
    Component.onCompleted: console.log("Completed Running!")
    Rectangle {
        Component.onCompleted: console.log("Nested Completed Running!")
    }
}

注: 相应的处理程序是onCompleted


destruction()

在对象开始销毁时发出。该处理程序可用于撤销对completed() 信号或应用程序中其他命令式代码所做的响应。

onDestruction 信号处理程序可以在任何对象上声明。处理程序的运行顺序未定义。

Rectangle {
    Component.onDestruction: console.log("Destruction Beginning!")
    Rectangle {
        Component.onDestruction: console.log("Nested Destruction Beginning!")
    }
}

注: 相应的处理程序是onDestruction

另请参见 Qt Qml.


方法文档

QtObject createObject(QtObject parent, object properties)

创建并返回该组件的对象实例,该实例将具有给定的parentpropertiesproperties 参数为可选参数。如果对象创建失败,则返回空值。

对象将在与创建组件时相同的上下文中创建。如果组件不是在 QML 中创建的,调用此函数时将总是返回空值。

如果您希望创建对象时不设置父对象,请为parent 值指定null 。请注意,如果要显示返回的对象,必须提供有效的parent 值或设置返回对象的parent 属性,否则对象将不可见。

如果未向 createObject() 提供parent ,则必须保留对返回对象的引用,以免该对象被垃圾回收器销毁。无论之后是否设置Item::parent ,情况都是如此,因为设置项父对象并不会改变对象的所有权。改变的只是图形父对象。

QtQuick 1.1 开始,该方法接受一个可选的properties 参数,用于指定创建对象的初始属性值映射。这些值将在对象创建最终完成前应用。这比在创建对象后设置属性值更有效,尤其是在定义了大量属性值的情况下,而且还允许在创建对象前设置属性绑定(使用Qt.binding )。

properties 参数被指定为属性值项的映射。例如,下面的代码创建了一个对象,其初始xy 值分别为 100 和 100:

const component = Qt.createComponent("Button.qml");
if (component.status === Component.Ready) {
    component.createObject(parent, { x: 100, y: 100 });
}

可使用destroy() 方法删除动态创建的实例。更多信息,请参阅从 JavaScript 动态创建 QML 对象

另请参阅 incubateObject()。


string errorString()

返回任何错误的人可读描述。

字符串包括每个错误的文件、位置和描述。如果存在多个错误,则用换行符分隔。

如果没有错误,则返回空字符串。


object incubateObject(QtObject parent, object properties, enumeration mode)

为该组件实例创建孵化器。孵化器允许异步实例化新的组件实例,并且不会导致用户界面冻结。

parent 参数指定了创建实例的父对象。省略该参数或传递空值将创建一个没有父对象的对象。在这种情况下,必须保留对创建对象的引用,以免垃圾回收器将其销毁。

properties mode 可以是 Qt.Synchronous 或 Qt.Asynchronous,用于控制同步或异步创建实例。默认值为异步。在某些情况下,即使指定了 Qt.Synchronous,孵化器也可能以异步方式创建对象。如果调用 incubateObject() 的组件本身是异步创建的,就会出现这种情况。

所有三个参数都是可选的。

如果创建成功,该方法将返回一个孵化器,否则返回空。孵化器具有以下属性:

  • status - 孵化器的状态。有效值为 Component.Ready、Component.Loading 和 Component.Error。
  • object - 创建的对象实例。只有当孵化器处于就绪状态时才可用。
  • onStatusChanged - 指定状态改变时调用的回调函数。状态将作为参数传递给回调函数。
  • forceCompletion() - 调用该函数可同步完成孵化。

下面的示例演示了如何使用孵化器:

const component = Qt.createComponent("Button.qml");

const incubator = component.incubateObject(parent, { x: 10, y: 10 });
if (incubator.status !== Component.Ready) {
    incubator.onStatusChanged = function(status) {
        if (status === Component.Ready) {
            print("Object", incubator.object, "is now ready!");
        }
    };
} else {
    print("Object", incubator.object, "is ready immediately!");
}

动态创建的实例可通过destroy() 方法删除。更多信息,请参阅从 JavaScript 动态创建 QML 对象

另请参阅 createObject().


© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.