QML Component Element

QML Component Element

Component实例化了C++类QDeclarativeComponent

Properties

   progress : real
   status : enumeration
   url : url

Attached Signals

   onCompleted
   onDestruction

Methods

   createObject
   errorString

详细描述
Component具有可重用性,封装好的具有良好接口定义的QML元素。

通常来说component被定义在组件文件中——就是独立的.qml文件。这有利于在文件中重用小的组。
例如,这里component被多个Loader对象使用。它包含一个单个item,一个Rectangle。

import QtQuick 1.0

Item {
   width: 100; height: 100

   Component {
   id: redSquare

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

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

注意尽管Rectangle元素会自动渲染和显示,但对于上面例子则不同。上面的例子中rectangle是在一个组件(component)中定义的。组件包含的一些QML元素,好像在独立的一个QML文件中定义,只要当需要的时候才会执行加载。

定义一个Component类似于定义一个QML文档。一个QML文档有单个的顶层item,定义了这个组件的行为和属性,不能在这个顶层item外面定义行为和属性。同样,Component定义包含了一个单独的顶层item(上面例子中是Rectangle),不能在这个item外面定义任何数据,除了id(上面的例子是redSquare)。

(一个组件只能包含一个id属性和一个顶层的item,其中id是可选的但item必须定义,不能定义一个空的组件。)

组件通常是为视图的提供图形化组件。例如ListView::delegate属性需要指定一个组件来绘制列表的每一项。

组件对象还可以通过调用Qt.createComponent()来动态创建一个组件对象。

属性:

read-onlyprogress : real

表明加载组件的进度。0.0表示没有加载,1.0表示加载完毕。

read-onlystatus : enumeration

status表明组件加载的状态。有以下可选值:

Component.Null—— 表明没有设置需要加载的QML数据。

Component.Ready ——表明QML数据已经加载完毕,可以用于创建实例。

Component.Loading 表明正在加载QML数据。

Component.Error—— 表明加载QML数据时出错,调用errorString() 可以提供错误提示。

read-onlyurl : url

组件的URL可被用于构建这个组件。

信号:

Component :: onCompleted ()

当组件启动完成后onCompleted()信号会被发送。我们可以在启动后执行一些代码。 附属属性Component :: onCompleted 能被任何元素应用。onCompleted 的运行顺序是未定的。

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

Component :: onDestruction ()当组件析构时会发送onDestruction ()信号。可用于执行undo操作,或其它必需的代码。

附属属性Component :: onDestruction 可被其他任何代码应用。然而,它适用于这个组件的整体的析构,而不是指定对象的析构。onDestruction 运行顺序未定。

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

方法:
[table]
[tr=rgb(246,246,246)][td]

object Component::createObject ( Item parent )

[/td][/tr]
[/table]
创建一个以parent为父item的组件的对象实例病返回它。如果创建失败则返回null。

被创建对象的上下文和这个组件是相同的,如果不是被创建在QML中,则返回null。

如果你希望创建的对象不设置父对象,则指定parent的值为null。注意如果想让创建的组件显示,则需要指定一个合法的父item(非null的)或是手动为创建的对象设置一个合法的父item,否则创建的组件将不会显示。

动态创建的实例能被destroy() 方法删除。

[table]
[tr=rgb(246,246,246)][td]

string Component::errorString ()

[/td][/tr]
[/table]
返回可读的错误信息。
The string includes the file, location, and description of each error. If multiple errors are present they are separated by a newline character.
字符串包括所在的文件,所在的行以及错误信息描述。每个错误的错误信息会占用一行。

没有错误返回空。

在componet上折腾了很久,组件里边包含了很多不同的id,就是不能引用,才知道“一个组件只能包含一个id属性和一个顶层的item,其中id是可选的但item必须定义,不能定义一个空的组件。”,也就是只能用这个组件的id,引用这个组件。。。。

定义一个Component类似于定义一个QML文档 这就解释了为什么同一个文件中定义delegate要加Component,另外文件中定义delegate就不用加的原因了,也解释了为什么调用Component里面其他的id会出现找不到的现象了,揭开了一个谜团,学到了,呵呵