在工程中有很多情况是需要动态创建对象来完成需求的,QML当中也是可以进行动态创建的,创建的范围包括但不限于组件和对象。
成都创新互联是专业的金东网站建设公司,金东接单;提供成都做网站、成都网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行金东网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!首先想要动态创建组件需要了解组件是什么
一、Component
Component是由一个由开发者封装好的,只暴露必要接口的QML类型,可以重复使用,有点像类的概念但又不完全像。下面是一个组件的定义:
Component{
id:id_Comp
Rectangle{
id:id_Root
width: 200
height: 200
color: mData ? "red" : "blue"
property bool mData: false
MouseArea{
anchors.fill: parent
onClicked: {
id_Root.mData = !id_Root.mData
}
}
}
}
这就是定义了一个点击变色的矩形组件,组件的定义要求就是只能包含一个顶层Item,并且在这个Item之外不能定义除了Id之外的任何数据,它通常是给view提供图形化组件的,它本身不是一个可见元素,必须要实例化后才能显示。而示例化的方式可以静态添加也可以动态创建,这里主要讲一下动态创建。注:定义Component时组件名与文件名一致,组件名首字母大写。组件实例的id和组成组件的顶层Item的id是各自独立的。
二、动态创建的方式
1.Loader
Loader用来动态加载QML组件,可以把它当作一个占位符,需要用时才加载。下面是Loader的实例:
Loader{
id:id_loader
sourceComponent: id_Comp
}
通过代码就可以知道loader只需要设置sourceComponent或source属性,就可以把组件加载进来,当sourceComponent或source发生改变时会重新加载对象,之前加载的对象会被销毁。当sourceComponent或source为空或者undefined时,会销毁当前加载的对象,相关资源也会释放,而loader对象则会变为一个空对象。loader的item属性指向了它顶层item,所以可以通过访问loader的item去修改被加载对象的属性。如果组件过大,加载起来非常耗费资源,可以采用异步加载的方式只需要将asynchronous属性设置为true就可以了。
2.在ECMAScript中动态创建对象
在ECMAScript中,有两种方式可以动态创建:
a.使用Qt.CreateComponent()动态创建一个组件对象,然后使用Component的createObject()方法创建对象
var component = Qt.createComponent("Button.qml");
if (component.status == Component.Ready) {
var button = component.createObject(parent,
{"width":120,"height":120});
}
返回的button对象就行动态创建出来的对象的地址,可以通过button去修改对象的属性
createObject函数第一个参数指定parent,后面的列表指定属性
b.使用Qt.createQmlObject()从QML字符串直接创建一个对象
这种情况适用于在同一个qml文件内部就进行创建
const newObject = Qt.createQmlObject(`
import QtQuick 2.0
Rectangle {
color: "red"
width: 20
height: 20
}
`,
parentItem,
"myDynamicSnippet"
);
第一个参数是需要创建的QML对象的描述文档,第二个参数是指定parent,第三个参数是关联文件,用于错误报告
注意:动态创建的对象不需要使用之后应该进行销毁,如果是loader进行管理的就将source或者sourceComponent设置为空,其它的就应该调用destroy()方法进行销毁,这个函数的唯一参数是指定多少毫秒再进行删除,不写就为0,立即删除。
常规的动态创建方法基本就是上述三种,还有些非常规的比如Repeater,这个在之后的文章进行单独介绍
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧