• QML类型:Loader


    一、描述

    Loader 用于动态加载 QML 组件。

    Loader 可以加载 QML 文件(使用 source 属性)或 Component 对象(使用 sourceComponent 属性)。 它可用于延迟组件的创建。

    下面例子在单击 MouseArea 时将“Page1.qml”作为组件加载:

    1. import QtQuick 2.0
    2. Item {
    3. width: 200; height: 200
    4. Loader { id: pageLoader }
    5. MouseArea {
    6. anchors.fill: parent
    7. onClicked: pageLoader.source = "Page1.qml"
    8. }
    9. }

    可以使用 item 属性访问加载的对象。

    如果 source sourceComponent 发生更改,则任何先前实例化的项目都将被销毁。

    source 设置为空字符串或将 sourceComponent 设置为 undefined 会销毁当前加载的对象,释放资源并将 Loader 置空。

    1.1、加载器大小调整行为

    如果源组件不是 Item 类型,Loader 不会应用任何特殊的大小调整规则。当用于加载具有视觉效果的类型时,Loader 应用以下大小规则:

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

    在下面这两种情况下,项目和加载器的大小是相同的。这确保了锚定到加载器等同于锚定到加载的项目

    1.2、接收来自加载对象的信号

    可以使用 Connections 类型接收从加载的对象发出的任何信号:

    1. import QtQuick
    2. Window {
    3. width: 640
    4. height: 480
    5. visible: true
    6. title: qsTr("Hello World")
    7. Item {
    8. width: 200; height: 200
    9. Loader {
    10. id: myLoader
    11. sourceComponent: rect
    12. }
    13. Connections
    14. {
    15. target: myLoader.item
    16. function onMessage(msg) { console.log(msg) }
    17. }
    18. Component {
    19. id: rect
    20. Rectangle {
    21. id: myItem
    22. signal message(string msg)
    23. width: 100; height: 100
    24. MouseArea {
    25. anchors.fill: parent
    26. onClicked: myItem.message("按下")
    27. }
    28. }
    29. }
    30. }
    31. }

    加载的对象也可以直接调用 Loader 或其父项中定义的任何函数:

    1. import QtQuick
    2. Window {
    3. id:root
    4. width: 640
    5. height: 480
    6. visible: true
    7. title: qsTr("Hello World")
    8. function fun03() { console.log("fun03") }
    9. Item {
    10. id:loader_parent
    11. width: 200; height: 200
    12. function fun02() { console.log("fun02") }
    13. Loader {
    14. id: myLoader
    15. sourceComponent: rect
    16. function fun01() { console.log("fun01") }
    17. }
    18. Component {
    19. id: rect
    20. Rectangle {
    21. id: myItem
    22. signal message(string msg)
    23. width: 100; height: 100
    24. MouseArea {
    25. anchors.fill: parent
    26. onClicked:
    27. {
    28. myLoader.fun01()
    29. loader_parent.fun02()
    30. root.fun03()
    31. }
    32. }
    33. }
    34. }
    35. }
    36. }

    1.3、焦点和按键事件

    Loader 是一个焦点作用域。它的 focus 属性必须设置为 true。

    1. import QtQuick
    2. Window {
    3. width: 640
    4. height: 480
    5. visible: true
    6. title: qsTr("Hello World")
    7. Item {
    8. id:loader_parent
    9. width: 200; height: 200
    10. Loader {
    11. id: myLoader
    12. sourceComponent: rect
    13. focus: true
    14. }
    15. Keys.onPressed: (event)=>
    16. {
    17. console.log("被载入的组件-放弃-捕获键盘按下事件");//01
    18. }
    19. Component {
    20. id: rect
    21. Item
    22. {
    23. Item
    24. {
    25. focus: true
    26. Keys.onPressed: (event)=>
    27. {
    28. console.log("被载入的组件接收键盘按下事件");//02
    29. event.accepted = true;
    30. }
    31. }
    32. }
    33. }
    34. }
    35. }

    上面的代码: 

    • 被载入的组件和 Loader 要同时设置 focus 为 true,被载入的组件才能接收到键盘按下事件。打印02。
    • 被载入组件设置 focus 为 false,Loader 设置 focus 为 true 则打印01

    1.4、在视图委托中使用 Loader

    在视图委托中使用 Loader 可以提高委托加载性能。但要注意正确的用法。

    一个普通的委托:

    当使用 Loader  时外部的组件不能引用 index

    正确的用法:

    或:

    二、属性成员

    1、active : bool

    Loader 当前是否处于活动状态。默认为 true。

    如果 Loader 处于非活动状态,则更改 source sourceComponent 不会导致项目被实例化,直到 Loader 处于活动状态。

    非活动加载程序的 status 始终为 Loader.Null

    2、asynchronous : bool

    组件是否将被异步实例化。默认为 false。

    当与 source 属性结合使用时,加载和编译也将在后台线程中执行。

    3、【只读】item : QtObject

    当前加载的顶级对象。

    4、progress : real

    从网络加载 QML 数据的进度,从 0.0(未加载)到 1.0(已完成)。大多数 QML 文件都非常小,因此该值会迅速从 0 变为 1。

    5、source : url

    要实例化的 QML 组件的 URL。

    要卸载当前加载的对象,将此属性设置为空字符串,或将 sourceComponent 设置为 undefined。 将 source 设置为新的 URL 也会导致前一个 URL 创建的项目被卸载。

    6、sourceComponent : Component

    要实例化的组件。要卸载当前加载的对象,将此属性设置为 undefined

    1. Item {
    2. Component {
    3. id: redSquare
    4. Rectangle { color: "red"; width: 10; height: 10 }
    5. }
    6. Loader { sourceComponent: redSquare }
    7. Loader { sourceComponent: redSquare; x: 10 }
    8. }

    7、status : enumeration

    QML 加载的状态。

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

    三、信号成员

    1、loaded()

    当状态变为 Loader.Ready 或成功初始加载时发出此信号。

    四、成员函数

    1、object setSource(url source, object properties)

    创建具有给定属性的给定源组件的对象实例。properties 参数是可选的。加载和实例化完成后,可以通过 item 属性访问该实例。

    如果在调用此函数时 active 属性为 false,则不会加载给定的源组件,但会缓存源和初始属性。当加载器激活时,将使用初始属性集创建源组件的实例。

    以这种方式设置组件实例的初始属性值不会触发任何关联的行为(比如属性动画)。

    如果在调用此函数之后但在设置加载程序激活之前更改了源或源组件,则缓存的属性将被清除。

  • 相关阅读:
    抢先体验!星河社区ERNIE Bot SDK现已支持文心大模型4.0
    用go设计开发一个自己的轻量级登录库/框架吧
    性能测试分类
    Mysql专题
    七夕送女朋友什么礼物?2022年七夕礼物推荐
    EasyRecovery15非常好用的电脑数据恢复软件
    高等数学(第七版)同济大学 习题9-5 个人解答
    WireShark抓包软件的使用 上海商学院 计算机网络 实验作业3
    BG#研究报告 - 体重管理攻略
    参数估计法在逻辑斯谛回归的应用
  • 原文地址:https://blog.csdn.net/kenfan1647/article/details/125401180