11.qml-通过方法来加载组件、字符串方式加载组件
在上章,我们学习了10.qml-组件、Loader、Component介绍.
本章我们继续来学习组件的其它创建方式.
1.调用Function来加载和移除组件
之前我们是使用Loader对象来实现加载和移除组件,本节我们通过调用Function的形式来实现加载和移除组件.
Component拥有的信号有:
- completed() : 对应的号接收器是Component.onCompleted,onCompleted处理程序的运行顺序未定义,它可以在任何对象上声明,比如我们放在Window对象下,则表示只要Window界面加载完成那么就触发,而假如Window下面有个Button对象,那么Button加载后是不会再次触发,除非在Button下面也写上Component.onCompleted,
- destruction() : 对应的号接收器是Component.onDestruction,当对象调用destroy()时,会触发该信号,用来做资源清理工作,它可以在任何对象上声明,处理程序的运行顺序未定义
Component拥有的方法有:
- object createObject(parent, object properties) :创建一个此Component的实例,参数1表示该实例的父类,参数2是个可选的属性初始化参数
QT帮助示例如下所示:
import QtQuick 2.0
Item {
id: container
width: 300; height: 300
function loadButton() {
var component = Qt.createComponent("Button.qml"); // 通过Qt.createComponent()来创建一个组件
if (component.status == Component.Ready) {
var button = component.createObject(container); // 组件创建成功后,则通过component.createObject()来进行实例化对象
button.color = "red";
}
}
Component.onCompleted: loadButton() // Item加载成功后,则调用loadButton()方法
}
其中Qt.createComponent的方法定义如下所示:
object Qt.createComponent(url, mode, parent) ;
//通过指定的url路径来创建qml组件对象.创建失败则返回null,
//mode是可选的参数,设置创建方式是同步还是异步,为Component.Asynchronous或者Component.PreferSynchronous,
//parent则是设置组件的父对象.
假如我们是像上章4小节那样,使用Component嵌入式定义组件,那么就不需要调用Qt.createComponent()创建组件了,因为组件已经存在,直接使用dynamicBtn.createObject(parent)即可实例化一个button对象.
示例如下所示(需要用到上章的DynamicBtn.qml文件):
import QtQuick 2.14
import QtQuick.Window 2.0
import QtQuick.Controls 2.0 Window{
id: wind
visible: true function onAdd() {
console.log("onAdd")
colum.count += 1
if (colum.count % 2 == 1) { // 通过DynamicBtn.qml来实例化对象
let component = Qt.createComponent("qrc:/DynamicBtn.qml");
let button = component.createObject(colum);
button.text = "button"+colum.count.toString()
button.backColor = Qt.rgba(Math.random(),Math.random(),Math.random(),1)
} else { // 通过嵌入的Component组件直接实例化对象
let button = dynamicBtn.createObject(colum);
button.text = "button"+colum.count.toString()
button.backColor = Qt.rgba(Math.random(),Math.random(),Math.random(),1)
}
}
function onRemove() {
if (colum.data.length > 0) {
console.log("onRemove button"+ colum.data.length)
colum.data[colum.data.length - 1].destroy();
colum.count -= 1
}
} Row {
id: row
spacing: 20
padding: 20
Button {
id: load
text: "添加一个Buuton"
onClicked: onAdd();
}
Button {
id: remove
text: "移除一个Buuton"
onClicked: onRemove();
}
} Column {
id: colum
property var count: 0
anchors.top: row.bottom
spacing: 20
padding: 20 } Component {
id: dynamicBtn
Button {
property var backColor: "#7BCBEB" // 背景颜色
text: "button"
implicitWidth: 100
implicitHeight: 32
hoverEnabled: true
contentItem: Label { // 设置文本
id: btnForeground
text: parent.text
font.family: "Microsoft Yahei"
font.pixelSize: 20
color: "#FFFFFF"
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight
}
background: Rectangle {
id: btnBack
color: backColor
radius: height / 4 Rectangle {
width: btnBack.width * 0.9
height: btnBack.height * 0.4
x: btnBack.width * 0.05
y: btnBack.height * 0.05
radius: width / 2
color: Qt.lighter(btnBack.color, 1.09) }
}
onDownChanged: {
btnBack.color = down ? Qt.lighter(backColor, 0.9) : backColor // 设置按下的背景颜色
}
onHoveredChanged: {
btnBack.color = hovered ? Qt.lighter(backColor, 1.1) : backColor // 设置徘徊的背景颜色
}
} }
}
效果如下所示:

2.通过字符串来加载和移除组件
需要用到的方法如下所示:
object Qt.createQmlObject(qml, object parent, string filepath)
//通过qml字符串来实例化一个新对象,如果创建对象时出错,则返回null。
//其中parent是可选的,用来指定该对象的父类
//filepath也是可选的,它将用于创建对象的错误报告。
//如果创建错误,将会抛出一个err对象,此对象有一个附加属性qmlErrors,它是遇到的错误的数组。此数组中的每个对象都有成员lineNumber、Number、fileName和message、
示例如下所示:
import QtQuick 2.14
import QtQuick.Window 2.0
import QtQuick.Controls 2.0 Window{
id: wind
property var objArr: []
visible: true
height: 600; width: 480
color: "#FFFFFF"
Column {
spacing: 8
z: 1000
Row {
height: create.height
spacing: 8
Button {
id: create
text: "创建组件"
height: 30
onClicked: {
try {
objArr[objArr.length] = Qt.createQmlObject(qmlText.text, wind);
textHint.text = "当前组件个数:" + objArr.length
} catch(err) {
console.log('Error on line:' + err.qmlErrors[0].lineNumber + '\n message:' + err.qmlErrors[0].message);
}
}
}
Button {
id: remove
height: 30
text: "移除组件" onClicked: {
if (objArr.length > 0) {
objArr[0].destroy();
objArr.splice(0,1); // splice除了替换内容外,还可以当成删除数组元素使用,这里表示从数组下标0,删除1个元素.
textHint.text = "当前组件个数:" + objArr.length
}
}
}
Text {
id: textHint
font.pixelSize: 14
text: "当前组件个数: 0"
anchors.baseline: remove.baseline
}
} Rectangle {
width: 360; height: 240
color: "transparent"
TextEdit {
id: qmlText
anchors.fill: parent; anchors.margins: 5
readOnly: false
font.pixelSize: 14
selectByMouse: true
wrapMode: TextEdit.WordWrap text: 'import QtQuick 2.0\n' +
'Rectangle {\n'+
' width: 360; height: 240\n'+
' color: "red"\n'+
' x: 100\n'+
' y: 100\n}'
}
}
}
}
运行效果如下所示:

当我们编辑好内容后,点击"创建组件",然后就会通过字符串来创建组件,然后点击移除组件,则会将最早创建的组件移除掉。
11.qml-通过方法来加载组件、字符串方式加载组件的更多相关文章
- 一道前端面试题:定义一个方法将string的每个字符串间加个空格返回,调用的方式'hello world'.spacify();
偶然在群里看到了这道题:定义一个方法将string的每个字符串间加个空格返回,调用的方式'hello world'.spacify(); 这道题主要是对JavaScript对象原型的考察.
- Vue性能优化之组件按需加载(以及一些常见的性能优化方法)
关于Vue中的按需加载我就简单介绍一下:大概就是我们所有的东西都会在app.js里面,但是我们并不需要把所有的组件都一次性加载进来,我们可以在需要它的时候再将它加载进来,话不多说,开车! 1.webp ...
- Vue加载组件、动态加载组件的几种方式
https://cn.vuejs.org/v2/guide/components.html https://cn.vuejs.org/v2/guide/components-dynamic-async ...
- OS10.11系统下 安装cocoapods 以及 安装cocoapods-xcode-plugin-master插件来加载三方框架
http://www.cnblogs.com/cheng923181/p/4883476.html OS10.11系统下 安装cocoapods 以及 安装cocoapods-xcode-plugin ...
- 1.引入必要的文件 2.加载 UI 组件的方式 4.Parser 解析器
//引入 jQuery 核心库,这里采用的是 2.0 <scripttype="text/javascript"src="easyui/jquery.min.js& ...
- 【原】从一个bug浅谈YUI3组件的资源加载
篇前声明:为了不涉及业务细节,篇内信息统一以某游戏,某功能代替 前不久,某游戏准备内测客户端,开发人员测试过程中发现某功能突然不灵了,之前的测试一切ok,没有发现任何异常,第一反应是,游戏内浏览器都是 ...
- React Router 4.0 + webpack 实现组件按需加载
网上关于React Router 4.0的按需加载文章有很多,大致的思路都一样,但是其实具体实现起来却要根据自己的实际情况来定,这里主要介绍一下我的实现方式. 主要方式是通过Route组件的rende ...
- Vue 路由&组件懒加载(按需加载)
当打包构建应用时,Javascript 包会变得非常大,影响页面加载速度.使用Vue路由懒加载和组件懒加载可以提升页面加载速度,减少白屏时间,提升用户体验. 用法有如下三种:(路由懒加载与组件懒加载用 ...
- 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间
[源码下载] 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间 作者:webabcd 介绍速战速决 之 PHP 动态地创 ...
随机推荐
- 为什么是InfluxDB | 写在《InfluxDB原理和实战》出版之际
1年前写的一篇旧文,文中的分析,以及探讨的问题和观点,至今仍有意义. 从2016年起,笔者在腾讯公司负责QQ后台的海量服务分布式组件的架构设计和研发工作,例如微服务开发框架SPP.名字路由CMLB.名 ...
- Codeforces Round #533 C. Ayoub and Lost Array
题面: 传送门 题目描述: 题意很简单:1.数组中的所有整数都在区间[l, r],2.所有元素之和能被3整除.现在知道这个数组的大小,l和r,问:按照题目的要求组成的数组一共有多少种可能. 题目分 ...
- Python中类的特殊属性和魔术方法
1.属性 属性 含义 __name__ 类.函数.方法等的名字 __dir__ __module__ 类定义所在的模块名 __class__ 对象或类所属的类 只是返回基类 __bases__ ...
- Android中的TaskStack及启动模式
目录 前言 如何观察ActivityStack? 几个问题 关键类介绍 ActivityStack的创建与种类 不同启动模式 launchMode Standard SingleTop SingleT ...
- 12、MyBatis教程之缓存
13.缓存 简介 1.什么是缓存 [ Cache ]? 存在内存中的临时数据. 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高 ...
- 阿里一面CyclicBarrier和CountDownLatch的区别是啥
引言 前面一篇文章我们<Java高并发编程基础三大利器之CountDownLatch>它有一个缺点,就是它的计数器只能够使用一次,也就是说当计数器(state)减到为 0的时候,如果 再有 ...
- python之极简ATM系统示例
"""用户可登陆系统输错三次锁定账号用户可以创建新的用户名密码新用户初始账户设为0新用户可直接登陆系统用户登陆成功后可以选择业务类型用户数据可以根据业务修改输入Q随时退出 ...
- 阿里最强 Python 自动化工具开源了!
1. 前言 大家好,我是安果! 最近,阿里内部开源了一个 iOS 端由 Python 编写的自动化工具,即:tidevice 它是一款跨平台的自动化开源工具,不依赖 Xcode 就可以启动 WebDr ...
- Redis扩展数据类型详解
在Redis中有5种基本数据类型,分别是String, List, Hash, Set, Zset.除此之外,Redis中还有一些实用性很高的扩展数据类型,下面来介绍一下这些扩展数据类型以及它们的使用 ...
- 锋利的NodeJS之NodeJS多线程
最近刚好有朋友在问Node.js多线程的问题,我总结了一下,可以考虑使用源码包里面的worker_threads或者第三方的模块来实现. 首先明确一下多线程在Node.js中的概念,然后在聊聊work ...