QML Loader(加载程序)

Loader加载器用于动态加载 QML 组件。加载程序可以加载 QML 文件(使用 source 属性)或组件对象(使用 sourceComponent 属性)

常用属性:

active 活动
asynchronous异步,默认为false
item项目
progress 进度
source资源
sourceComponent资源组件
status状态

status:enumeration 

Loader.Null 加载器处于非活动状态或未设置 QML 源
Loader.ReadyQML 源已加载
Loader.Loading 当前正在加载 QML 源
Loader.Error 加载 QML 源时出错

信号:

loaded当状态为加载或就绪状态时,发射该信号

函数: 

setSource()设置资源

加载QML文件:

myWIdget.qml

import QtQuick 2.9

Rectangle{
    width: 100;height: 100;color: "red"
}

main.qml

import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    id:window1
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Rectangle{
        width: 300;
        height: 300
        focus:true
        color: "lightBlue"
        Loader{
            id:loader1
        }
        Keys.onSpacePressed: { //按下空格

            loader1.source="myWidget.qml" //加载QML文件
        }
    }

}

 加载组件对象:

使用sourceComponent属性

Rectangle{
        width: 300;
        height: 300
        focus:true
        color: "lightBlue"
        Component{
            id:con1
            Image{
                width: 200;height: 200
                source: "qrc:/image/zzpic23859.jpg"
            }
        }
    }
    Loader{sourceComponent: con1}//加载组件对象

 状态的使用:

Loader{
            id:load
            sourceComponent: con1//加载的资源控件
            onStatusChanged: {
                if(load.status==Loader.Ready)
                    console.log("加载完成")
                else if(load.status==Loader.Error)
                    console.log("加载失败")
                else if(load.status==Loader.Loading)
                    console.log("加载中")
            }
        }

setSource(url source,Object properties)

  • source资源
  • properties 对象
  • 创建将具有给定属性的给定组件的对象实例。属性参数是可选的。加载和实例化完成后,可通过 item 属性访问该实例。
//myWidget.qml
import QtQuick 2.9

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

//main.qml

Rectangle{
        width: 300;
        height: 300
        focus:true
        color: "lightBlue"
        Loader{
            id:load
        }
        Component.onCompleted: {
            load.setSource("myWidget.qml",{color="yellow"})//设置资源和属性
        }
    }

加载程序的大小

如果源组件不是 Item 类型,则加载程序不会应用任何特殊的大小调整规则。用于加载视觉对象类型时,加载程序应用以下大小调整规则:

  • 如果未为加载器指定显式大小,则加载器会在加载组件后自动调整为加载项的大小。
  • 如果通过设置宽度、高度或锚定显式指定加载器的大小,则加载的项目将调整为加载器的大小。

当Loader中没有设置大小,直接使用控件大小

Rectangle{
        width: 300;
        height: 300
        focus:true
        color: "lightBlue"
        Component{
            id:com1
            Rectangle{
                width: 100
                height:100
                color: "red"
            }
        }
        Loader{
            //anchors.fill: parent
            sourceComponent: com1
        }
    }

 当Loader中设置了,优先使用Loader中的设置

例一:

Rectangle{
        width: 300;
        height: 300
        focus:true
        color: "lightBlue"
        Component{
            id:com1
            Rectangle{
                width: 100
                height:100
                color: "red"
            }
        }
        Loader{
            anchors.fill: parent//填充整个父类
            sourceComponent: com1
        }
    }

例二: 

Rectangle{
        width: 300;
        height: 300
        focus:true
        color: "lightBlue"
        Component{
            id:com1
            Rectangle{
                width: 100
                height:100
                color: "red"
            }
        }
        Loader{
            width:200
            height:200
            sourceComponent: com1
        }
    }

例一:                                                  例二: 

 从加载的对象接收信号:

使用item可以获取生成的对象

//myWidget.qml

import QtQuick 2.9

Rectangle{
    width: 100
    height: 100
    color: "red"
    signal pick //创建一个信号
}


//main.qml


 Rectangle{
        width: 300;
        height: 300
        focus:true
        color: "lightBlue"
        
        Loader{
            id:load
            source: "myWidget.qml"
        }
        Connections{
            target: load.item//获取生成的对象
            onPick:console.log("执行")
        }
    }

焦点和关键事件

加载程序是一个焦点范围。必须将其焦点属性设置为true ,其任何子项才能获得活动焦点

//myWidget.qml


import QtQuick 2.9

Rectangle{
    width: 100;height: 100;color: "red"
    focus:true
    Keys.onSpacePressed: {   //按下空格键触发
        console.log("加载项触发")
        event.accepted=true
    }

}


//main.qml

Rectangle{
        width: 300;height: 300
        color: "lightBlue"

        Loader{
            id:load
            source: "myWidget.qml"
            focus:true//获取焦点
        }

    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QML Loader加载QML文件时,该文件中的所有元素和属性都会被解析和加载。在加载过程中,QML解释器会按照元素在文件中的顺序执行相应的构造函数和属性设置函数。具体来说,以下是QML加载过程中可能会执行的函数: 1. 构造函数:每个元素都有一个对应的构造函数,用于创建该元素的实例。当QML解释器读取到一个元素时,会立即调用该元素的构造函数,创建一个实例对象。例如: ``` Rectangle { width: 100 height: 100 } ``` 在这个例子中,QML解释器会调用Rectangle元素的构造函数,创建一个Rectangle实例对象。 2. 初始化函数:一些元素在创建实例后需要执行一些初始化操作,例如设置一些默认属性值或者连接一些信号槽。这些初始化操作通常在元素的Component.onCompleted信号中进行。例如: ``` Rectangle { width: 100 height: 100 Component.onCompleted: { console.log("Rectangle initialized") } } ``` 在这个例子中,QML解释器会在创建Rectangle实例后,调用Rectangle元素的Component.onCompleted信号中的函数,输出"Rectangle initialized"。 3. 属性设置函数:当QML解释器读取到一个元素的属性时,会立即调用该属性对应的设置函数,对元素实例的属性进行设置。例如: ``` Rectangle { width: 100 height: 100 } Text { text: "Hello World" font.pixelSize: 12 } ``` 在这个例子中,QML解释器会先创建一个Rectangle实例对象,然后创建一个Text实例对象。在创建Text实例对象时,QML解释器会先调用text属性的设置函数,将文本内容设置为"Hello World",然后调用font.pixelSize属性的设置函数,将字体大小设置为12像素。 总之,QML Loader加载QML文件时,会按照元素在文件中的顺序执行构造函数、初始化函数和属性设置函数,完成所有元素的创建和初始化工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值