使用Loader动态加载组件

使用Loader动态加载组件

https://blog.csdn.net/u012419303/article/details/45568545

https://blog.csdn.net/u012419303/category_3138565.html

Loader元素用来动态加载可见的QML组件,它可以加载一个QML文件(使用source属性)或者一个组件对象(使用sourceComponent属性)。

对于拖延组件的创建很是有用的:例如,当一个组件需要在要求的时候被创建,或者由于性能原因一个组件不应该被创建时。

Item {
     200; height: 200
    Loader {id: pageLoader}
    MouseArea {
        anchors.fill: parent
        onClicked: pageLoader.source = "Page1.qml"<span style="white-space:pre">	</span>//单击加载“Page1.qml”作为一个组件
    }
}
可以通过item属性来访问被加载的项目,如果source或者sourceComponent更改了,任何先前实例化的项目都将被销毁。

将source设置为空字符串或者sourceComponent设置为undefined,则销毁当前加载的项目,释放资源,并将Loader设置为空。

1. Loader的大小行为

Loader和其他任何可见的项目一样,必须对其进行位置和大小的设置,这样它才能成为可见的。

如果没有明确指定Loader的大小,那么Loader将会在组件加载完成后自动设置为组件的大小,如果通过设置width和height或者使用锚明确指定了Loader的大小,那么被加载的项目将会改变为Loader的大小

2. 从加载的项目中接收信号

任何被加载的项目中发射的信号都可以使用Connections元素进行接收。

下面是application.qml加载了MyItem,然后通过一个Connections对象来接收加载的项目的message信号。

application.qml的内容:

import QtQuick 2.4

Item {
     100; height: 100
    Loader {
        id: myLoader
        source: "MyItem.qml"
    }
    Connections {
        target: myLoader.item
        onMessage: console.log(msg)
    }
}
MyItem.qml文件的内容
import QtQuick 2.0

Rectangle {
    id: myItem
    signal message(string msg)
     100; height: 100
    MouseArea {
        anchors.fill: parent
        onClicked: myItem.message("clicked!")
    }
}
因为MyItem.qml是在Loader的作用域中被加载的,所以可以直接调用在Loader或者其父项目中定义的任何函数。

3. 焦点和键盘事件

Loader是一个焦点作用域,对于它的任何获得活动焦点的子项目都必须将focus属性设置为true。任何在被加载的项目中的键盘事件也应该被接收,从而使它们不传播到Loader。

如下面,application.qml中的MouseArea单击时会加载KeyReader.qml,注意Loader中以及被加载的对象中都将focus属性设置为了true。

application.qml的内容:

import QtQuick 2.4

Rectangle {
     200; height:200
    Loader {
        id: loader
        focus: true
    }
    MouseArea {
        anchors.fill: parent
        onClicked: loader.source = "KeyReader.qml"
    }
    Keys.onPressed: {
        console.log("Captured: ", event.text);
    }
}
KeyReader.qml内容
import QtQuick 2.0

Item {
    Item {
        focus: true
        Keys.onPressed: {
            console.log("Loaded item captured: ", event.text)
            event.accepted = true
        }
    }
}
一旦KeyReader.qml被加载完成,它便会接收键盘事件而且这里讲event.accepted设置为了true,这样事件就不会传播到父项目Rectangle中。

=============== End

原文地址:https://www.cnblogs.com/lsgxeva/p/12591789.html