Component是可重用的,使用定义良好的接口封装QML类型。通常由组件文件(即文件)定义.qml。
本文: https://www.lovejia.win/blog/article/Component.html
参考原文:http://doc.qt.io/qt-5/qml-qtqml-component.html
参考译文:http://blog.csdn.net/vampire_armand/article/details/38981119
属性说明
progress : real
加载组件的进展,从0.0(未加载)到1.0(完成加载)。
status : enumeration
此属性保存组件加载的状态。状态可以是以下之一:
Component.Null - 没有可用于组件的数据
Component.Ready - 组件已加载,可用于创建实例。
Component.Loading - 当前正在加载组件
Component.Error - 加载组件时发生错误。调用errorString()将提供任何错误的可读的描述。
url : url
组件URL。这是用于构造组件的URL。
信号说明
completed()
在组件启动完成之后发射这个信号。这被用来在完整的QML环境建立后,执行启动脚本代码。
响应的操作句柄是onCompleted。它能在任何对象中宣部,onCompleted的运行次序是未定义的。
destruction()
当对象开始销毁时发出。这可以用于撤消响应completed()信号或应用程序中的其他命令性代码所做的工作。
相应的处理程序是onDestruction。它可以在任何对象上声明。运行onDestruction处理程序的顺序未定义。
注意:onDestruction被用于组件整体被摧毁,而不是一个具体的对象。
方法说明
object createObject(QtObject parent, object properties)
用parent和properties创建并返回一个组件的实例。properties参数是可选的,如果创建失败,则返回空。创建对象的内容和组件被创建时一致。如果调用的组件不是在QML中创建的,则这个函数总是返回null。
如果我们希望创建不设置父母的对象,指定parent的值为空。
注意:如果返回的对象需要被显示,我们必须提供有效的父母值或设置返回对象的父母属性,否则对象将不可见。如果父母没有在createObject()的时候被提供,返回对象的引用则被保留而不会被垃圾收集器摧毁。这是真的不管,无论Item::parent是否被设置。这是因为设置Item::parent没有改变对象的拥有者,仅仅是显示控制的父被改变。
在QtQuick 1.1,这个方法接受可选择的属性参数,它是创建实例的初始化属性值的映射。这些值在对象创建结束前被设置比创建之后设置更有效率,特别对大型属性值的定义,效率提升的更明显。同时它也允许属性在对象创建之前绑定(使用Qt.binding)。
string errorString()
返回错误的描述。
字符串包括每个错误的文件,位置和描述。如果存在多个错误,则它们由换行符分隔。如果没有错误,则返回空字符串。
object incubateObject(Item parent, object properties, enumeration mode)
为组件的实例创建孵化器。孵化器允许我们异步创建组件的实例,这么做不会阻塞UI。
parent指明了创建的实例的父,该参数允许为空,标识没有父。在这种情况下,实例的引用被保留,而不会被垃圾收集器摧毁。properties参数是实例被构造是,用来初始化属性的值的映射。模式为Qt.Synchronous或Qt.Asynchronous,用来控制我们同步还是异步创建实例。默认是异步的。在某些情况下,即使Qt.Synchronous被设置,实例依然异步创建。这发生在调用incubateObject()的组件实例本身就被异步创建的时候。
3个参数都是可选的。
如果成功,该方法返回一个孵化器对象,否则为空。孵化器有下面的属性:
status:孵化期的状态,有效值是Component.Ready、Component.Loading和Component.Error。
object Thecreated object instance:仅仅当孵化期在Ready状态有效,为孵化器创建的实例。
onStatusChanged:状态变化时指定的回调,status作为参数传递。
forceCompletion():该调用使孵化器同步完成。
功能简述
Component是可重用的,使用定义良好的接口封装QML类型。
Component通常由组件文件(即文件)定义.qml。该组件,实质上允许内嵌定义QML组件,一个内QML文件,而不是作为一个单独的QML文件。这可能有助于重用QML文件中的小组件,或者用于定义逻辑上属于文件中的其他QML组件的组件。
定义a Component类似于定义QML文档。QML文档具有单个顶级项目,其定义该组件的行为和属性,并且不能在该顶级项目之外定义属性或行为。以同样的方式,一个Component定义包含一个顶级项,除了id之外,不能定义这个项之外的任何数据。
Component类型通常用于为视图提供图形组件;Component对象也可以使用Qt.createComponent()动态创建。
例
下面的例子显示是一个由多个Loader对象使用的组件。它包含一个单一的项目,一个矩形:
1 | import QtQuick 2.0 |
注意:虽然Rectangle本身会自动呈现和显示,但上述矩形不是这样,因为它在a中定义Component。组件封装了QML类型,就好像它们在单独的QML文件中定义,并且直到被请求(在这种情况下,两个Loader对象)才被加载。因为Component不是从Item派生的,所以不能将任何东西锚定到它。
在下面的示例中,comp1是在MyItem.qml的根上下文中创建的,从该组件实例化的任何对象都可以访问该上下文中的ids和属性,例如internalSettings.color。当在另一个上下文comp1中用作ListView委托(如下面的main.qml)时,它将继续访问其创建上下文的属性(否则它将对外部用户是私有的):
MyItem.qml:
1 | Item { |
main.qml:
1 | ListView { |
以下示例演示如何使用孵化器:
1 | var component = Qt.createComponent("Button.qml"); |