QML Component 与 Loader 结合动态加载组件
在实际项目中,有时候我们写好一个组件,但不是立即加载出来,而是触发某些条件后才动态的加载显示出来,当处理完某些操作后,再次将其关闭掉;
这样的需求,可以使用 Component 包裹着组件,然后使用 Loader 去动态的加载和关闭;
Component 可以加载任何部件,例如,Rectangle,Button,Image等等
如果需要包裹多个部件,使用 Item { } 包裹着这些部件即可;
Component {Item {Rectangle { }Button { }......}
}
Component 有两个很常用信号,就是创建前触发和销毁前触发,类似构造函数和析构函数,也可以说时回调;
只需要在定义该槽函数即可
Window {id: root// 窗口创建时触发 Component.onCompleted: { root.x = 200 root.y = 200 root.color = "green" console.log("onCompleted", width, height) }// 窗口销毁时触发 Component.onDestruction: { console.log("onDestruction") }
}
窗口创建销毁前都会去执行相应方法
下面是使用Component加载一个 Rectangle
Component { id: com Rectangle { id: rect width: 200 height: 100 color: "red" }
}
如果直接这样写上去,程序运行后,是不会在窗口中有加载Rectangle出来的,需要使用Loader 去动态加载才行
Loader { id: loader sourceComponent: com // 加载id为 com 的组件
}
在Loader中有一个status状态可以用于判断窗口处于哪个阶段;
填写上 onStatusChanged: { } 槽函数,在status状态发生改变时,此槽函数回立即触发;
status 一共有四种状态:
Loader.Null - 未加载 - 0
Loader.Ready - 已加载 - 1
Loader.Loading - 加载中 - 2
Loader.Error - 加载错误 - 3
可以在槽函数中,根据这些状态去做某些相应的操作:
Loader { id: loader // 异步加载部件,当这个部件很大时,例如加载很大的图片,或者加载很大的数据,为了不卡死界面,需要使用异步加载 asynchronous: true sourceComponent: com onStatusChanged: { console.log("status:", status) if (2 == status) { // 处理一些操作 console.log("加载中...") } else if (1 == status){ // 处理以下操作 console.log("加载完毕.") } }
}
需要注意的是,加载中,需要在异步加载窗口的时候才会体现出来,即属性 asynchronous: true
当然,也可以在被加载的Rectangle部件中,写上Component.onCompleted: { } 和 Component.onDestruction: { }
这样当Rectangle被成功加载后,或者被关闭后都会触发槽函数;
Rectangle { id: rect width: 200 height: 100 color: "red" // 窗口创建时触发 Component.onCompleted: { console.log("onCompleted", width, height) } // 窗口销毁时触发 Component.onDestruction: { console.log("onDestruction") }
}
那么,如何动态的去加载呢?
为了模仿这些场景,我们定义两个按钮,一个用于加载,一个用于关闭;
Button { x: 250 text: "关闭" onClicked: { loader.sourceComponent = null }
} Button { x: 250 y: 100 text: "显示" onClicked: { loader.sourceComponent = com }
}
将sourceComponent 赋值null即可将窗口隐藏,将sourceComponent 赋值Component的id即可加载显示;
现在将Loader中的sourceComponent置null;
Loader { id: loader sourceComponent: null......
}
当Rectangle被加载出来后,我们还能不能再修改他呢?
答案是可以的!
需要使用到loader.item属性;查看帮助文档介绍:
此属性保存当前加载的顶级对象。
那么也就是说,loader.item 也就相当于rect;即Rectangle的id;
新加第三个按钮,用于测试:
Button { x: 250 y: 200 text: "修改属性" onClicked: { loader.item.width = 50 loader.item.height = 50 loader.item.color = "green" }
}
另外 Loader的source属性可以加载自己编写的qml文件
Loader {id: loadersource: "/MyRectangle.qml"
}
最后是代码分享:
import QtQuick 2.9
import QtQuick.Window 2.2import QtQuick.Controls 2.2Window {id: rootvisible: truewidth: 640height: 480title: qsTr("Hello World")color: "white"minimumWidth: 300minimumHeight: 400maximumHeight: 500maximumWidth: 400// 透明度//opacity: 0.5// 窗口创建时触发
// Component.onCompleted: {
// root.x = 200
// root.y = 200
// root.color = "green"
// console.log("onCompleted", width, height)
// }// // 窗口销毁时触发
// Component.onDestruction: {
// console.log("onDestruction")
// }// Component 可以加载任何部件,然后可以使用 Loader 去动态加载,然后也可以再动态销毁掉Component {id: comRectangle {id: rectwidth: 200height: 100color: "red"// 窗口创建时触发Component.onCompleted: {console.log("onCompleted", width, height)}// 窗口销毁时触发Component.onDestruction: {console.log("onDestruction")}}// Component 内部如果需要添加多个部件,需要使用Item包裹着
// Item {
// id: item_id
// Rectangle {
// id: rect1
// width: 60
// height:60
// color: "yellow"
// }
// Button {
// id: btn
// y:100
// text: "测试按钮"
// }
// Image { }
// }}Loader {id: loader// 异步加载部件,当这个部件很大时,例如加载很大的图片,或者加载很大的数据,为了不卡死界面,需要使用异步加载asynchronous: true//source: "/MyRectangle.qml"sourceComponent: comonStatusChanged: {console.log("status:", status)// 加载中if (2 == status) {// 处理一些操作console.log("加载中...")} else if (1 == status){// 处理以下操作console.log("加载完毕.")}}}Button {x: 250text: "关闭"onClicked: {loader.sourceComponent = null}}Button {x: 250y: 100text: "显示"onClicked: {loader.sourceComponent = com}}Button {x: 250y: 200text: "修改属性"onClicked: {loader.item.width = 50loader.item.height = 50loader.item.color = "green"}}
}
完!
相关文章:

QML Component 与 Loader 结合动态加载组件
在实际项目中,有时候我们写好一个组件,但不是立即加载出来,而是触发某些条件后才动态的加载显示出来,当处理完某些操作后,再次将其关闭掉; 这样的需求,可以使用 Component 包裹着组件ÿ…...
Visual studio 2022 将打开文件的方式由单击改为双击
1. 打开vs2022,选择Tools -> Options打开Options设置页面 2. 在左侧依次展开Environment, 选择Tabs and Windows 3. 在右侧面板往下拖拽滚动条,找到Preview Tab section, unchecked "Preview selected files in Solution Explorer (Altclick t…...

网络工程师 (49)UDP协议
前言 UDP协议,即用户数据报协议(User Datagram Protocol),是一种无连接的、不可靠的、面向报文的传输层通信协议。 一、基本特点 无连接性:UDP在发送数据之前不需要与目标设备建立连接,也无需在数据发送结束…...

了解大数据
一、大数据的特点: 1.大量 2.高速 3.多样 结构化数据和非结构化数据 4.低价值密度 二、大数据的应用场景:视频推荐、电商推荐等 三、大数据的技术发展脉络 阶段1:单机时代 阶段2:大数据时代-分布式处理 阶段3:实…...
命令模式
1. 命令模式简介 命令模式(Command Pattern)是一种行为型设计模式,它将一个请求封装为一个对象,从而使您可以用不同的请求对客户进行参数化、对请求排队或记录请求日志,以及支持可撤销的操作。命令模式的核心思想是将操作和操作的执行者解耦,使得操作可以独立于执行者进…...

解放大脑!用DeepSeek自动生成PPT!
DeepSeek应用(PPT篇) DeepSeek作为当前最好的AI大模型之一,其强大的文本生成能力被广泛的应用于各个领域,本文我们来聊聊用DeepSeek来自动生成PPT。 一、DeepSeek & PPT DeepSeek本身没有直接生成PPT的能力,换个…...
GUI编程(window系统→Linux系统)
最近有个项目需要将windows系统的程序往Linux系统上面移植,由于之前程序没有考虑过多平台兼容的问题,导致部分功能不可用以下是对近期遇到的问题的总结,以及相应的解决方案和经验分享。 1. Python 模块安装与管理 在 Linux 系统中࿰…...

互推机制在开源AI智能名片2+1链动模式S2B2C商城小程序源码推广中的应用探索
摘要: 在数字化营销时代,开源AI智能名片21链动模式S2B2C商城小程序源码作为一种创新的技术解决方案,正逐步成为企业数字化转型的重要工具。然而,面对激烈的市场竞争,如何高效推广这一前沿技术产品,成为开发…...

Pytorch实现之特征损失与残差结构稳定GAN训练,并训练自己的数据集
简介 简介:生成器和鉴别器分别采用了4个新颖设计的残差结构实现,同时在损失中结合了鉴别器层的特征损失来提高模型性能。 论文题目:Image Generation by Residual Block Based Generative Adversarial Networks(基于残留块的生成对抗网络产生图像) 会议:2022 IEEE Int…...
ES6相关操作(2)
一.Promise Promise是ES6引入的异步编程工具。 语法上Promise是一个构造函数,用于封装异步操作并可以获取操作成功或失败的结果 Promise构造函数:Promise(excutor){} Promise的常用函数:then,catch 实例化Promise对象(创建Promise工具) let data"请求数据"//该数据为…...

自动化办公|xlwings生成图表
在日常的数据分析和报告生成中,Excel图表是一个非常重要的工具。它能够帮助我们直观地展示数据,发现数据中的规律和趋势。然而,手动创建和调整图表往往耗时且容易出错。幸运的是,借助Python的xlwings库,我们可以自动化…...

大模型知识蒸馏技术(5)——在线蒸馏
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 在线蒸馏概述 在线蒸馏是一种知识蒸馏方式,其核心特点是教师模型和学生模型的参数在训练过程中同时更新,整个蒸馏框架是端到端训练的。这种方式允许教师模型和学生模型相互影响、共同学习,能…...
Java 条件语句
Java 条件语句概述 条件语句通过判断给定条件的真假来控制程序的执行。本小节将详细介绍 Java 中各类条件语句。 1. if 语句 1.1 语法 用于根据给定条件决定是否执行一段代码。if 块仅在关联的布尔表达式为 true 时执行。 if (条件) {// 当条件成立时执行此处代码 }大括号…...

用JMeter给要登录的操作做压力测试
压力测试的http请求路径如下图 应当添加http Header Manager,设置登录凭证...
算法的数学基础
组合数 从n个不同元素中取出m(m≤n)个不同元素的所有组合的个数:C(n, m) n! / [m!(n - m)!]n个物品所有可能的组合数(不考虑组合的大小m):Σ C(n, m) C(n, 0) C(n, 1) C(n, 2) … C(n, n) 2 n 2^n 2…...

flowable适配达梦数据库
文章目录 适配相关问题无法从数据库产品名称“DM DBMS”中推断数据库类型分析解决 构建ibatis SqlSessionFactory时出错:inStream参数为null分析解决 liquibase相关问题问题一:不支持的数据库 Error executing SQL call current_schema: 无法解析的成员访…...

VScode C语言学习开发环境;运行提示“#Include错误,无法打开源文件stdio.h”
C/C环境配置 参考: VS Code 配置 C/C 编程运行环境(保姆级教程)_vscode配置c环境-CSDN博客 基本步骤 - 安装MinGW-W64,其包含 GCC 编译器:bin目录添加到环境变量;CMD 中输入gcc --version或where gcc验证…...

DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
对于个人开发者或尝鲜者而言,本地想要部署 DeepSeek 有很多种方案,但是一旦涉及到企业级部署,则步骤将会繁琐很多。 比如我们的第一步就需要先根据实际业务场景评估出我们到底需要部署什么规格的模型,以及我们所要部署的模型&…...

自制简单的图片查看器(python)
图片格式:支持常见的图片格式(JPG、PNG、BMP、GIF)。 import os import tkinter as tk from tkinter import filedialog, messagebox from PIL import Image, ImageTkclass ImageViewer:def __init__(self, root):self.root rootself.root.…...
RD-搭建测试环境
测试团队职责 环境验证:确保开发部署的测试环境可访问,页面/接口无阻塞问题; 配置检查**:核对数据库连接、接口域名、HT证书等关键配置; 数据准备**:导入基线数据,隔离测试与生产数据࿱…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...