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 动态地创 ...
随机推荐
- 15款NOSQL数据库
1.MongoDB 介绍 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.主要解决的是海量数据的访问效率问题,为WEB应用提供可扩展的高性能数据存储解决方案.当数据量达到50GB以上 ...
- Vue3手册译稿 - 深入组件 - 自定义事件
本章节需要掌握组件基础 emit我译成发射,觉得发射这个词比较形象的形容将子组件事件发射出来的一个动作. 事件名 像组件和props,事件名也会进行自动转换,如果你在子组件里发射一个驼峰命名的事件,你 ...
- 文本编辑工具 Vim与压缩打包
vim一共有3种模式:一般模式.编辑模式和命令模式 一般模式下的移动光标 光标向左移动:h或者向左的方向键 光标向右移动:l或者向右的方向键光标向上移动:k或者向上的方向键光标向下移动:j或者向下的方 ...
- Linux 用户登陆提示This account is currently not available
使用 su 切换到用户 hdfs 时提示:This account is currently not available,使用 hdfs 用户登陆会直接退出 ssh 窗口. 此时可以尝试检查文件 /e ...
- Elasticsearch 结构化搜索、keyword、Term查询
前言 Elasticsearch 中的结构化搜索,即面向数值.日期.时间.布尔等类型数据的搜索,这些数据类型格式精确,通常使用基于词项的term精确匹配或者prefix前缀匹配.本文还将新版本的&qu ...
- Android Studio中批量注释 Java代码
•ctrl+/ 选中需要注释的多行代码,然后按 ctrl + / 实现多行快速注释: 再次按下 ctrl + / 取消注释. •ctrl+shift+/ 选中一行或几行代码,按 ctrl + shif ...
- Oracle 存储结构
数据库是存储数据的容器,它的主要功能是保存和共享数据. oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构,对于这两种存储结构,oracle是分别进行管理的. 逻辑存储结构:oracle内 ...
- jd的艺术
我看最近的狗东的ldz很火哈.所以我也来凑个热闹发个教程. 准备工作 1.一台openwrt系统设备 2.一个脑子 3.一双手 话不多说,开始吧! 步骤 一.链接N1(你的设备) 这里需要一款ssh工 ...
- 【Flutter 3-5】Flutter进阶教程——在Flutter中使用Lottie动画
作者 | 弗拉德 来源 | 弗拉德(公众号:fulade_me) Lottie动画 在移动开发中总是需要展示一些动画特效,作为程序员的我们并不是很擅长用代码做动画,即便是有些动画可以实现,在跨平台的过 ...
- 【Prolog - 1.0 基础语法与概念】
[概述] Prolog的语法与其它常用语言(如C,JAVA等)不同,它更接近于自然语言. [实例] 当我想表示"Mia是以女人"这个事实(之后会提到事实这个概念)的时候,我可以这么 ...