在工程中有很多情況是需要?jiǎng)討B(tài)創(chuàng)建對(duì)象來完成需求的,QML當(dāng)中也是可以進(jìn)行動(dòng)態(tài)創(chuàng)建的,創(chuàng)建的范圍包括但不限于組件和對(duì)象。
成都創(chuàng)新互聯(lián)是專業(yè)的金東網(wǎng)站建設(shè)公司,金東接單;提供成都做網(wǎng)站、成都網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行金東網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!首先想要?jiǎng)討B(tài)創(chuàng)建組件需要了解組件是什么
一、Component
Component是由一個(gè)由開發(fā)者封裝好的,只暴露必要接口的QML類型,可以重復(fù)使用,有點(diǎn)像類的概念但又不完全像。下面是一個(gè)組件的定義:
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
}
}
}
}
這就是定義了一個(gè)點(diǎn)擊變色的矩形組件,組件的定義要求就是只能包含一個(gè)頂層Item,并且在這個(gè)Item之外不能定義除了Id之外的任何數(shù)據(jù),它通常是給view提供圖形化組件的,它本身不是一個(gè)可見元素,必須要實(shí)例化后才能顯示。而示例化的方式可以靜態(tài)添加也可以動(dòng)態(tài)創(chuàng)建,這里主要講一下動(dòng)態(tài)創(chuàng)建。注:定義Component時(shí)組件名與文件名一致,組件名首字母大寫。組件實(shí)例的id和組成組件的頂層Item的id是各自獨(dú)立的。
二、動(dòng)態(tài)創(chuàng)建的方式
1.Loader
Loader用來動(dòng)態(tài)加載QML組件,可以把它當(dāng)作一個(gè)占位符,需要用時(shí)才加載。下面是Loader的實(shí)例:
Loader{
id:id_loader
sourceComponent: id_Comp
}
通過代碼就可以知道loader只需要設(shè)置sourceComponent或source屬性,就可以把組件加載進(jìn)來,當(dāng)sourceComponent或source發(fā)生改變時(shí)會(huì)重新加載對(duì)象,之前加載的對(duì)象會(huì)被銷毀。當(dāng)sourceComponent或source為空或者undefined時(shí),會(huì)銷毀當(dāng)前加載的對(duì)象,相關(guān)資源也會(huì)釋放,而loader對(duì)象則會(huì)變?yōu)橐粋€(gè)空對(duì)象。loader的item屬性指向了它頂層item,所以可以通過訪問loader的item去修改被加載對(duì)象的屬性。如果組件過大,加載起來非常耗費(fèi)資源,可以采用異步加載的方式只需要將asynchronous屬性設(shè)置為true就可以了。
2.在ECMAScript中動(dòng)態(tài)創(chuàng)建對(duì)象
在ECMAScript中,有兩種方式可以動(dòng)態(tài)創(chuàng)建:
a.使用Qt.CreateComponent()動(dòng)態(tài)創(chuàng)建一個(gè)組件對(duì)象,然后使用Component的createObject()方法創(chuàng)建對(duì)象
var component = Qt.createComponent("Button.qml");
if (component.status == Component.Ready) {
var button = component.createObject(parent,
{"width":120,"height":120});
}
返回的button對(duì)象就行動(dòng)態(tài)創(chuàng)建出來的對(duì)象的地址,可以通過button去修改對(duì)象的屬性
createObject函數(shù)第一個(gè)參數(shù)指定parent,后面的列表指定屬性
b.使用Qt.createQmlObject()從QML字符串直接創(chuàng)建一個(gè)對(duì)象
這種情況適用于在同一個(gè)qml文件內(nèi)部就進(jìn)行創(chuàng)建
const newObject = Qt.createQmlObject(`
import QtQuick 2.0
Rectangle {
color: "red"
width: 20
height: 20
}
`,
parentItem,
"myDynamicSnippet"
);
第一個(gè)參數(shù)是需要?jiǎng)?chuàng)建的QML對(duì)象的描述文檔,第二個(gè)參數(shù)是指定parent,第三個(gè)參數(shù)是關(guān)聯(lián)文件,用于錯(cuò)誤報(bào)告
注意:動(dòng)態(tài)創(chuàng)建的對(duì)象不需要使用之后應(yīng)該進(jìn)行銷毀,如果是loader進(jìn)行管理的就將source或者sourceComponent設(shè)置為空,其它的就應(yīng)該調(diào)用destroy()方法進(jìn)行銷毀,這個(gè)函數(shù)的唯一參數(shù)是指定多少毫秒再進(jìn)行刪除,不寫就為0,立即刪除。
常規(guī)的動(dòng)態(tài)創(chuàng)建方法基本就是上述三種,還有些非常規(guī)的比如Repeater,這個(gè)在之后的文章進(jìn)行單獨(dú)介紹
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧