zoukankan      html  css  js  c++  java
  • 使用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

  • 相关阅读:
    android 发送短信 怎样做到一条一条的发送,仅仅有在上一条发送成功之后才发送下一条短信
    qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果
    C小加 之 随机数
    垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
    WIZnet推出串口转以太网模块WIZ550S2E
    java里,当long与上了int
    几个常见字符串处理函数的实现原理
    Android平台调用Web Service:演示样例
    怎样学好游戏编程
    void及void指针含义的深刻解析
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/12591789.html
Copyright © 2011-2022 走看看