在上章,我们学习了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. ASP.Net Core中处理异常的几种方法

    本文将介绍在ASP.Net Core中处理异常的几种方法 1使用开发人员异常页面(The developer exception page) 2配置HTTP错误代码页 Configuring stat ...

  2. 使用ant design vue的日历组件,实现一个简单交易日与非交易日的切换

    使用ant design vue的日历组件,实现一个简单交易日与非交易日的切换 需求: 日历区分交易日.非交易日 可以切换面板查看整年交易日信息 可以在手动调整交易日.非交易日 演示实例 序--使用软 ...

  3. [DFS]排列的生成

    排列的生成 Time Limit:1000MS Memory Limit:65536K Total Submit:150 Accepted:95 Description 输出P(n,m)的排列(n,m ...

  4. 201871030131-谢林江 实验二 个人项目—《D{0-1} KP》项目报告

    项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.学习编写PSP2.完成个人项目实验要求3.在Github建仓 这个作业在哪些方面帮助我实现学习目标 1.首次编 ...

  5. spring-cloud-gateway 服务网关

    Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关.网关作为流量的,在微服务系统中有着非常作用,网关常见的功能有路由转发.权限校验.限流控制等 ...

  6. [Skill]VBA零基础入门及实践:根据链接展示图片

    简介 VBA(Visual Basic for Applications)是依附在应用程序(例如Excel)中的VB语言.只要你安装了Office Excel就自动默认安装了VBA,同样Word和Po ...

  7. 浅入Kubernetes(10):控制节点的部署,选择器、亲和性、污点

    目录 标签和nodeSelector 标签选择 亲和性和反亲和性 污点和容忍度 系统默认污点 容忍度 DaemonSet 在前面的学习中,我们学到了 Deployment 部署,以及副本数(Repli ...

  8. matlab文件管理

    当前文价夹浏览器以及路径管理器   在主页面左侧有单独的窗口进行显示,可以显示当前目录下的文件并提供文件搜索功能. 搜索路径 搜索先后步骤 输入字符串"polyfit" (1)检查 ...

  9. Day17_103_IO_InputStreamReader 字符转换流

    InputStreamReader 字符转换流 * import java.io.InputStreamReader; 将字节输入流转换为字符输入流 * import java.io.OutputSt ...

  10. 数栈运维实例:Oracle数据库运维场景下,智能运维如何落地生根?

    从马车到汽车是为了提升运输效率,而随着时代的发展,如今我们又希望用自动驾驶把驾驶员从开车这项体力劳动中解放出来,增加运行效率,同时也可减少交通事故发生率,这也是企业对于智能运维的诉求. 从人工运维到自 ...