JavaScript中 創(chuàng)建動態(tài) QML 對象的方法
一、動態(tài)創(chuàng)建對象
有兩種方法可以從 JavaScript 動態(tài)創(chuàng)建對象:
- 調(diào)用
Qt.createComponent()動態(tài)創(chuàng)建 Component 對象 - 使用
Qt.createQmlObject()從 QML 字符串創(chuàng)建對象
雖然動態(tài)創(chuàng)建的對象可以與其他對象一樣使用,但它們在 QML 中沒有 id。
1.1、動態(tài)創(chuàng)建組件
可以調(diào)用它的 createObject() 方法來創(chuàng)建該組件的一個(gè)實(shí)例。這個(gè)函數(shù)可以接受兩個(gè)參數(shù):
第一個(gè)是新對象的父對象。父對象可以是圖形對象(即 Item 類型)或非圖形對象(即 QtObject 或 C++ QObject 類型)。只有帶有圖形父對象的圖形對象才會被渲染到 Qt Quick 可視畫布上。如果希望稍后設(shè)置父級,可以安全地將 null 傳遞給此函數(shù)。
第二個(gè)是可選的,是一個(gè)屬性值對的映射,它定義了對象的初始任何屬性值。此參數(shù)指定的屬性值在對象創(chuàng)建完成之前應(yīng)用于對象,避免在必須初始化特定屬性以啟用其他屬性綁定時(shí)可能發(fā)生的綁定錯(cuò)誤。此外,與在創(chuàng)建對象后定義屬性值和綁定相比,性能優(yōu)勢很小。
示例。
Sprite.qml 它定義了一個(gè)簡單的 QML 組件:
import QtQuick 2.0
Rectangle { width: 80; height: 50; color: "red" }
main.qml 導(dǎo)入了一個(gè) componentCreation.js JavaScript 文件,該文件將創(chuàng)建 Sprite 對象:
import QtQuick 2.0
import "componentCreation.js" as MyScript
Rectangle
{
id: appWindow
width: 300; height: 300
Component.onCompleted: MyScript.createSpriteObjects();
}
componentCreation.js
var component;
var sprite;
function createSpriteObjects()
{
component = Qt.createComponent("Sprite.qml");
if (component.status == Component.Ready)
finishCreation();
else
component.statusChanged.connect(finishCreation);
}
function finishCreation()
{
if (component.status == Component.Ready)
{
sprite = component.createObject(appWindow, {x: 100, y: 100});
if (sprite == null)
{
console.log("Error creating object");
}
}
else if (component.status == Component.Error)
{
console.log("Error loading component:", component.errorString());
}
}
當(dāng)使用帶有相對路徑的文件時(shí),路徑應(yīng)該是相對于執(zhí)行 Qt.createComponent() 的文件。
也可以通過 incubateObject() 函數(shù)在不阻塞的情況下實(shí)例化組件。
1.2、從 QML 字符串創(chuàng)建對象
可以使用 Qt.createQmlObject() 函數(shù)從 QML 字符串創(chuàng)建 QML 對象,如下例所示:
const newObject = Qt.createQmlObject(`
import QtQuick 2.0
Rectangle
{
color: "red"
width: 20
height: 20
}
`,
parentItem,
"myDynamicSnippet"
);
- 第一個(gè)參數(shù)是要?jiǎng)?chuàng)建的 QML 字符串。
- 第二個(gè)參數(shù)是新對象的父對象,適用于組件的父參數(shù)語義同樣適用于
createQmlObject()。 - 第三個(gè)參數(shù)是與新對象關(guān)聯(lián)的文件路徑,這用于錯(cuò)誤報(bào)告。
如果 QML 字符串使用相對路徑導(dǎo)入文件,則路徑應(yīng)該相對于定義父對象(方法的第二個(gè)參數(shù))的文件。
在構(gòu)建靜態(tài) QML 應(yīng)用程序時(shí),會掃描 QML 文件以檢測導(dǎo)入依賴項(xiàng)。這樣,所有必要的插件和資源都會在編譯時(shí)解決。但是,這僅考慮顯式導(dǎo)入語句(位于 QML 文件頂部的語句),而不考慮包含在字符串文字中的導(dǎo)入語句。為了支持靜態(tài)構(gòu)建,用戶需要確保使用 Qt.createQmlObject() 的 QML 文件在文件頂部明確包含所有(包括字符串文字內(nèi)部)必要的導(dǎo)入。
二、動態(tài)刪除對象
在許多用戶界面中,將可視對象的不透明度設(shè)置為 0 或?qū)⒖梢晫ο笠瞥銎聊欢皇菍⑵鋭h除就足夠了。 但是,如果有大量動態(tài)創(chuàng)建的對象,則刪除未使用的對象可能會獲得有價(jià)值的性能優(yōu)勢。
請注意:永遠(yuǎn)不應(yīng)該手動刪除由便利 QML 對象工廠(例如 Loader 和 Repeater)動態(tài)創(chuàng)建的對象。此外,應(yīng)該避免刪除不是自己動態(tài)創(chuàng)建的對象。
可以使用 destroy() 方法刪除項(xiàng)目。 此方法有一個(gè)可選參數(shù)(默認(rèn)為 0),用于指定銷毀對象之前的近似延遲(以毫秒為單位)。
示例。application.qml 創(chuàng)建 SelfDestroyingRect.qml 組件的五個(gè)實(shí)例。 每個(gè)實(shí)例運(yùn)行一個(gè) NumberAnimation,當(dāng)動畫完成時(shí),調(diào)用它的根對象上的 destroy() 來銷毀自己:
application.qml???
import QtQuick 2.0
Item
{
id: container
width: 500; height: 100
Component.onCompleted:
{
var component = Qt.createComponent("SelfDestroyingRect.qml");
for (var i=0; i<5; i++)
{
var object = component.createObject(container);
object.x = (object.width + 10) * i;
}
}
}
SelfDestroyingRect.qml
import QtQuick 2.0
Rectangle
{
id: rect
width: 80; height: 80
color: "red"
NumberAnimation on opacity
{
to: 0
duration: 1000
onRunningChanged:
{
if (!running)
{
console.log("Destroying...")
rect.destroy();
}
}
}
}
或者,application.qml 可以通過調(diào)用 object.destroy() 銷毀創(chuàng)建的對象。
請注意:對該對象內(nèi)的對象調(diào)用 destroy() 是安全的。 對象不會在調(diào)用 destroy() 的瞬間被銷毀,而是在該腳本塊結(jié)束和下一幀之間的某個(gè)時(shí)間被清除(除非指定了非零延遲)。
另請注意,如果 SelfDestroyingRect 實(shí)例是像這樣靜態(tài)創(chuàng)建的:
Item
{
SelfDestroyingRect
{
// ...
}
}
這會導(dǎo)致錯(cuò)誤,因?yàn)閷ο笾挥性趧討B(tài)創(chuàng)建時(shí)才能動態(tài)銷毀。
使用 Qt.createQmlObject() 創(chuàng)建的對象可以類似地使用 destroy() 銷毀:
const newObject = Qt.createQmlObject(`
import QtQuick 2.0
Rectangle
{
color: "red"
width: 20
height: 20
}
`,
parentItem,
"myDynamicSnippet"
);
newObject.destroy(1000);
到此這篇關(guān)于 JavaScript中 創(chuàng)建動態(tài) QML 對象的方法的文章就介紹到這了,更多相關(guān) JavaScript 創(chuàng)建動態(tài) QML 對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解js正則表達(dá)式驗(yàn)證時(shí)間格式xxxx-xx-xx形式
本篇文章主要介紹了詳解js正則表達(dá)式驗(yàn)證時(shí)間格式xxxx-xx-xx形式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02
ESLint詳解及在WebStorm中的應(yīng)用步驟
ESLint是一種JavaScript代碼檢查工具,開發(fā)者可以通過自定義規(guī)則進(jìn)行代碼風(fēng)格和質(zhì)量的控制,使用ESLint的過程包括安裝、初始化配置、配置規(guī)則、運(yùn)行ESLint檢查代碼、與編輯器集成,以及與構(gòu)建工具集成等,需要的朋友可以參考下2024-09-09
Javascript Request獲取請求參數(shù)如何實(shí)現(xiàn)
使用Javascript Request獲取參數(shù)的時(shí)候總是提示出錯(cuò),本文為此問題提供詳細(xì)的解決方案,需要了解的朋友可以參考下2012-11-11
Bootstrap實(shí)現(xiàn)帶暫停功能的輪播組件(推薦)
最近小編在項(xiàng)目中用到了一款帶輪播組件,功能非常齊全,可以設(shè)置各種標(biāo)題樣式、動畫效果、輪播時(shí)間、開始暫停等功能,下面小編通過本文給大家詳細(xì)介紹下實(shí)現(xiàn)過程,需要的朋友參考下吧2016-11-11
詳解用webpack把我們的業(yè)務(wù)模塊分開打包的方法
本篇文章主要介紹了用webpack把我們的業(yè)務(wù)模塊分開打包的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
分享5個(gè)小技巧讓你寫出更好的 JavaScript 條件語句
在使用 JavaScript 時(shí),我們常常要寫不少的條件語句。這里有五個(gè)小技巧,可以讓你寫出更干凈、漂亮的條件語句。需要的朋友跟隨小編一起學(xué)習(xí)吧2018-10-10
javascript頁面倒計(jì)時(shí)實(shí)例
這篇文章主要介紹了javascript頁面倒計(jì)時(shí)實(shí)現(xiàn)方法,可實(shí)現(xiàn)簡單的頁面倒計(jì)時(shí)及自動提交表單功能,非常簡單實(shí)用,需要的朋友可以參考下2015-07-07
Javascript獲取HTML靜態(tài)頁面參數(shù)傳遞值示例
獲取HTML靜態(tài)頁面參數(shù)傳遞值可以利用split函數(shù)來按參數(shù)切成數(shù)組、利用正則表達(dá)式來獲取,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下2013-08-08

