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 动态地创 ...
随机推荐
- Java中HashMap的源码分析
先来回顾一下Map类中常用实现类的区别: HashMap:底层实现是哈希表+链表,在JDK8中,当链表长度大于8时转换为红黑树,线程不安全,效率高,允许key或value为null HashTable ...
- 使用C# (.NET Core) 实现命令设计模式 (Command Pattern)
本文的概念内容来自深入浅出设计模式一书. 项目需求 有这样一个可编程的新型遥控器, 它有7个可编程插槽, 每个插槽可连接不同的家用电器设备. 每个插槽对应两个按钮: 开, 关(ON, OFF). 此外 ...
- 微信小程序 | flex布局属性
flex-direction 主轴方向 row: 横向 row-reverse: 横向倒序 column: 纵向 column-reverse: 纵向倒序; flex-wrap 元素排列换行 nowr ...
- golang 性能调优分析工具 pprof (上)
一.golang 程序性能调优 在 golang 程序中,有哪些内容需要调试优化? 一般常规内容: cpu:程序对cpu的使用情况 - 使用时长,占比等 内存:程序对cpu的使用情况 - 使用时长,占 ...
- 使用docker搭建sonarqube
sonarqube是一款代码质量检查工具,使用sonar扫描我们写过的代码,可以有助于检查出代码的bug.规范性和健壮性,有助于提高我们的代码质量. 一.安装docker 安装完成之后,命令行输入 d ...
- Android Studio 之 在活动中使用 Toast
•简介 Toast 是 Android 系统提供的一种非常好的提醒方式: 在程序中可以使用它将一些短小的信息通知给用户: 这些信息会在一段时间内自动消失,并且不会占用任何屏幕空间 •Toast.mak ...
- 基于ZXing.Net生成一维二维码
新阁教育-喜科堂付工原创 最近很多小伙伴对一维码.二维码比较感兴趣,今天主要给大家分享一个C#生成条形码和二维码的案例. C#作为一个高级语言,特点就是快! 我们使用的是开源库ZXing,ZXing是 ...
- 学习笔记-vue.js快捷登录 enter
一般监听在输入密码的input监听keyup事件,加enter修饰符.如果input是组件,加上.native修饰符.<div id="app"> <input ...
- day6.细说类型2
一.字符串(一)字符串需要掌握的操作1.# strip (清除):序列是一段字符串,该函数表示从头和从尾部同时开始进行扫描,如果扫描的字符在序列字符串中,则剔除掉,一直到遇到一个不在序列字符串中的字符 ...
- canvas性能优化总结
canvas的主要功能就是用来绘制内容,有时候为了给用户流畅的视觉感受,需要绘制的频率要求很高,这样对绘制的性能就有要求,那么怎么才能写出高性能的绘制代码呢. 尽可能少调用api 例如我们绘制一段线条 ...