当前位置:网站首页>QML类型:Loader
QML类型:Loader
2022-06-23 16:52:00 【友善啊,朋友】
一、描述
Loader 用于动态加载 QML 组件。
Loader 可以加载 QML 文件(使用 source 属性)或 Component 对象(使用 sourceComponent 属性)。 它可用于延迟组件的创建。
下面例子在单击 MouseArea 时将“Page1.qml”作为组件加载:
import QtQuick 2.0
Item {
width: 200; height: 200
Loader { id: pageLoader }
MouseArea {
anchors.fill: parent
onClicked: pageLoader.source = "Page1.qml"
}
}可以使用 item 属性访问加载的对象。
如果 source 或 sourceComponent 发生更改,则任何先前实例化的项目都将被销毁。
将 source 设置为空字符串或将 sourceComponent 设置为 undefined 会销毁当前加载的对象,释放资源并将 Loader 置空。
1.1、加载器大小调整行为
如果源组件不是 Item 类型,Loader 不会应用任何特殊的大小调整规则。当用于加载具有视觉效果的类型时,Loader 应用以下大小规则:
- 如果没有为 Loader 指定显式大小,则加载组件后,Loader 会自动调整为加载项的大小。
- 如果通过设置宽度、高度或锚定来明确指定 Loader 的大小,则加载的项目将调整为 Loader 的大小。
在下面这两种情况下,项目和加载器的大小是相同的。这确保了锚定到加载器等同于锚定到加载的项目。


1.2、接收来自加载对象的信号
可以使用 Connections 类型接收从加载的对象发出的任何信号:
import QtQuick
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello World")
Item {
width: 200; height: 200
Loader {
id: myLoader
sourceComponent: rect
}
Connections
{
target: myLoader.item
function onMessage(msg) { console.log(msg) }
}
Component {
id: rect
Rectangle {
id: myItem
signal message(string msg)
width: 100; height: 100
MouseArea {
anchors.fill: parent
onClicked: myItem.message("按下")
}
}
}
}
}
加载的对象也可以直接调用 Loader 或其父项中定义的任何函数:
import QtQuick
Window {
id:root
width: 640
height: 480
visible: true
title: qsTr("Hello World")
function fun03() { console.log("fun03") }
Item {
id:loader_parent
width: 200; height: 200
function fun02() { console.log("fun02") }
Loader {
id: myLoader
sourceComponent: rect
function fun01() { console.log("fun01") }
}
Component {
id: rect
Rectangle {
id: myItem
signal message(string msg)
width: 100; height: 100
MouseArea {
anchors.fill: parent
onClicked:
{
myLoader.fun01()
loader_parent.fun02()
root.fun03()
}
}
}
}
}
}
1.3、焦点和按键事件
Loader 是一个焦点作用域。它的 focus 属性必须设置为 true。
import QtQuick
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello World")
Item {
id:loader_parent
width: 200; height: 200
Loader {
id: myLoader
sourceComponent: rect
focus: true
}
Keys.onPressed: (event)=>
{
console.log("被载入的组件-放弃-捕获键盘按下事件");//01
}
Component {
id: rect
Item
{
Item
{
focus: true
Keys.onPressed: (event)=>
{
console.log("被载入的组件接收键盘按下事件");//02
event.accepted = true;
}
}
}
}
}
}上面的代码:
- 被载入的组件和 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。
Item {
Component {
id: redSquare
Rectangle { color: "red"; width: 10; height: 10 }
}
Loader { sourceComponent: redSquare }
Loader { sourceComponent: redSquare; x: 10 }
}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,则不会加载给定的源组件,但会缓存源和初始属性。当加载器激活时,将使用初始属性集创建源组件的实例。
以这种方式设置组件实例的初始属性值不会触发任何关联的行为(比如属性动画)。
如果在调用此函数之后但在设置加载程序激活之前更改了源或源组件,则缓存的属性将被清除。
边栏推荐
- How to use JSON data format
- 论文阅读 (52):Self-Training Multi-Sequence Learning with Transformer for Weakly Supervised Video Anomaly
- Programmers are very useful ten tool websites, which are worth collecting
- 论文阅读 (50):A Novel Matrix Game with Payoffs of Maxitive Belief Structure
- Installation, configuration, désinstallation de MySQL
- 暂停更新公告—行走的皮卡丘
- 7、VLAN-Trunk
- Kotlin practical skills you should know
- Company offensive operation guide
- Analytic analog-to-digital (a/d) converter
猜你喜欢

论文阅读 (47):DTFD-MIL: Double-Tier Feature Distillation Multiple Instance Learning for Histopathology..

视频异常检测数据集 (ShanghaiTech)

Wiley-中国科学院文献情报中心开放科学联合研讨会第二讲:开放获取期刊选择及论文投稿...

README

论文阅读 (52):Self-Training Multi-Sequence Learning with Transformer for Weakly Supervised Video Anomaly

微信小程序startLocationUpdateBackground()简单实现骑手配送位置

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):...

FPN characteristic pyramid network
![[esp8266-01s] get weather, city, Beijing time](/img/8f/89e6f0d482f482ed462f1ebd53616d.png)
[esp8266-01s] get weather, city, Beijing time

torch学习(一):环境配置
随机推荐
Postgresql_根据执行计划优化SQL
Revil - blackmail Virus Emergency Response
[learning notes] tidb learning notes (III)
Single fire wire design series article 10: expanding application - single fire switch realizes double control
Call face recognition exception
《致敬百年巨匠 , 数藏袖珍书票》
How to design a seckill system - geek course notes
论文阅读 (55):Dynamic Multi-Robot Task Allocation under Uncertainty and Temporal Constraints
How to design a seckill system?
6、VLAN
The principle of MySQL index algorithm and the use of common indexes
Drawing black technology - easy to build a "real twin" 2D scene
Goframe framework: graceful closing process
Goframe framework: fast implementation of service end flow limiting Middleware
7、VLAN-Trunk
JS reset form
Tencent three sides: how to duplicate 4billion QQ numbers?
Kotlin invoke convention makes kotlin code more concise
Intelligent supply chain collaborative management solution for logistics industry
Baidu AI Cloud product upgrade Observatory in May