在上章,我们学习了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-通过方法来加载组件、字符串方式加载组件的更多相关文章

  1. 一道前端面试题:定义一个方法将string的每个字符串间加个空格返回,调用的方式'hello world'.spacify();

    偶然在群里看到了这道题:定义一个方法将string的每个字符串间加个空格返回,调用的方式'hello world'.spacify(); 这道题主要是对JavaScript对象原型的考察.

  2. Vue性能优化之组件按需加载(以及一些常见的性能优化方法)

    关于Vue中的按需加载我就简单介绍一下:大概就是我们所有的东西都会在app.js里面,但是我们并不需要把所有的组件都一次性加载进来,我们可以在需要它的时候再将它加载进来,话不多说,开车! 1.webp ...

  3. Vue加载组件、动态加载组件的几种方式

    https://cn.vuejs.org/v2/guide/components.html https://cn.vuejs.org/v2/guide/components-dynamic-async ...

  4. OS10.11系统下 安装cocoapods 以及 安装cocoapods-xcode-plugin-master插件来加载三方框架

    http://www.cnblogs.com/cheng923181/p/4883476.html OS10.11系统下 安装cocoapods 以及 安装cocoapods-xcode-plugin ...

  5. 1.引入必要的文件 2.加载 UI 组件的方式 4.Parser 解析器

    //引入 jQuery 核心库,这里采用的是 2.0 <scripttype="text/javascript"src="easyui/jquery.min.js& ...

  6. 【原】从一个bug浅谈YUI3组件的资源加载

    篇前声明:为了不涉及业务细节,篇内信息统一以某游戏,某功能代替 前不久,某游戏准备内测客户端,开发人员测试过程中发现某功能突然不灵了,之前的测试一切ok,没有发现任何异常,第一反应是,游戏内浏览器都是 ...

  7. React Router 4.0 + webpack 实现组件按需加载

    网上关于React Router 4.0的按需加载文章有很多,大致的思路都一样,但是其实具体实现起来却要根据自己的实际情况来定,这里主要介绍一下我的实现方式. 主要方式是通过Route组件的rende ...

  8. Vue 路由&组件懒加载(按需加载)

    当打包构建应用时,Javascript 包会变得非常大,影响页面加载速度.使用Vue路由懒加载和组件懒加载可以提升页面加载速度,减少白屏时间,提升用户体验. 用法有如下三种:(路由懒加载与组件懒加载用 ...

  9. 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间

    [源码下载] 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间 作者:webabcd 介绍速战速决 之 PHP 动态地创 ...

随机推荐

  1. Tornado 简明教程

    1.TornadoTornado:python编写的web服务器兼web应用框架1.1.Tornado的优势轻量级web框架异步非阻塞IO处理方式出色的抗负载能力优异的处理性能,不依赖多进程/多线程, ...

  2. (3)MySQL进阶篇SQL优化(索引)

    1.索引问题 索引是数据库优化中最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数 的SQL性能问题.本章节将对MySQL中的索引的分类.存储.使用方法做详细的介绍. 2.索引的存储分类 ...

  3. async await Task 使用方法

    使用概述 C#的使用过程中,除了以前的Thread.ThreadPool等用来开一个线程用来处理异步的内容.还可以使用新特性来处理异步.比以前的Thread和AutoResetEvent.delege ...

  4. redis数据库如何批量删除键和设置过期时间?

    我们可以借助Linux中的xargs,在终端中执行命令来实现这两个功能. 一.批量删除键 批量删除以"key"开头key的方法,需要借助Linux中的xargs,在终端中执行以下命 ...

  5. 庐山真面目之十四微服务架构的Docker虚拟技术深入探究

    庐山真面目之十四微服务架构的Docker虚拟技术深入探究 一.我的开场白 曾几何时,分布式的发展也影响了后来的微服务架构的实现方式.到了现在,只要涉及到互联网技术领域,就会设计一个概念,那就是微服务. ...

  6. Oauth2协议那些事

    1. 背景 首先,设想一种情境:你平常会使用一款照片存储App(以下照片服务指代),用来将自己喜欢的照片存放在上面以备随时查看.假如有一天,你想要打印其中的某张照片而且你找到了一款打印照片App(以下 ...

  7. js--如何实现继承?

    前言 学习过 java 的同学应该都知道,常见的继承有接口继承和实现继承,接口继承只需要继承父类的方法签名,实现继承则继承父类的实际的方法,js 中主要依靠原型链来实现继承,无法做接口继承. 学习 j ...

  8. Redis 6.1 redis-cluster-proxy 实践说明

    背景 ​ Redis3.0版本之后开始支持了Redis Cluster,Redis也开始有了分布式缓存的概念.关于Redis Cluster的相关说明,可以看之前的几篇文章:Redis Cluster ...

  9. Python数据分析入门(十七):绘制条形图

    条形图的绘制方式跟折线图非常的类似,只不过是换成了plt.bar方法.plt.bar方法有以下常用参数: x:一个数组或者列表,代表需要绘制的条形图的x轴的坐标点. height:一个数组或者列表,代 ...

  10. 如何调试 Java 开源项目源码,记一种源码导入开发工具并调试的通用方法

    楔子 说起读开源项目源码,很多朋友觉得高大上.大佬牛逼,云云~ 挡在很多人面前的不是源码怎么读,而是不知道如何导入源码到开发工具以及如何调试源码. 本文将以 spring-cloud-gateway ...