动态加载组件(Loading Components Dynamically)

动态加载QML不同组成部分最简单的方法是使用加载元素项(Loader element)。它作为一个占位符项用来加载项。项的加载通过资源属性(source property)或者资源组件(sourceCompontent)属性控制。加载元素项通过给定的URL链接加载项,然后实例化一个组件。

加载元素项(loader)作为一个占位符用于被加载项的加载。它的大小基于被加载项的大小而定,反之亦然。如果加载元素定义了大小,或者通过锚定(anchoring)定义了宽度和高度,被加载项将会被设置为加载元素项的大小。如果加载元素项没有设置大小,它将会根据被加载项的大小而定。

下面例子演示了使用加载元素项(Loader Element)将两个分离的用户界面部分加载到一个相同的空间。这个主意是我们有一个快速拨号界面,可以是数字界面或模拟界面。如下面插图所示。表盘周围的数字不受被加载项影响。

动态加载组件(Loading Components Dynamically) - 图1

动态加载组件(Loading Components Dynamically) - 图2

首先,在应用程序中声明一个加载元素项(Loader element)。注意,资源属性(source property)已经被忽略。这是因为资源取决于当前用户界面状态。

  1. Loader {
  2. id: dialLoader
  3. anchors.fill: parent
  4. }

拨号加载器(dialLoader)的父项的状态属性改变元素驱动根据不同状态加载不同的QML文件。在这个例子中,资源属性(source property)是一个相对文件路径,但是它可以是一个完整的URL链接,通过网络获取加载项。

  1. states: [
  2. State {
  3. name: "analog"
  4. PropertyChanges { target: analogButton; color: "green"; }
  5. PropertyChanges { target: dialLoader; source: "Analog.qml"; }
  6. },
  7. State {
  8. name: "digital"
  9. PropertyChanges { target: digitalButton; color: "green"; }
  10. PropertyChanges { target: dialLoader; source: "Digital.qml"; }
  11. }
  12. ]

为了使被加载项更加生动,它的速度属性必须根项的速度属性绑定。不能够使用直接绑定来绑定属性,因为项不是总在加载,并且这会随着时间而改变。需要使用一个东西来替换绑定元素(Binding Element)。绑定目标属性(target property),每次加载元素项改变时会触发已加载完成(onLoaded)信号。

  1. Loader {
  2. id: dialLoader
  3. anchors.left: parent.left
  4. anchors.right: parent.right
  5. anchors.top: parent.top
  6. anchors.bottom: analogButton.top
  7. onLoaded: {
  8. binder.target = dialLoader.item;
  9. }
  10. }
  11. Binding {
  12. id: binder
  13. property: "speed"
  14. value: speed
  15. }

当被加载项加载完成后,加载完成信号(onLoaded)会触发加载QML的动作。类似的,QML完成加载以来与组建构建完成(Component.onCompleted)信号。所有组建都可以使用这个信号,无论它们何时加载。例如,当整个用户界面完成加载后,整个应用程序的根组建可以使用它来启动自己。