QML动态对象管理
创始人
2024-05-29 03:01:20
0

QML中有多种方式来动态创建和管理QML对象:

  • Loader (加载器)
  • Repeater(复制器)
  • ListView,GridWiew,PethView(视图) (之后会介绍)

 使用加载器:

Rectangle{id:rect1width: 100height: 100color: "blue"Component{id:com1Rectangle{height: 50width: 50color: "red"}}}Loader{sourceComponent: com1}//加载一个com1

使用复制器:

Grid{spacing: 10columns: 5//五列//复制器Repeater{model:25//生成25个Rectangle{width:50;height: 50color: "lightGreen"Text{anchors.centerIn: parentfont{bold: true;pixelSize: 20}text:index//获取编号}}}}

 

使用JavaScript代码创建动态QML对象:

QML支持从JavaScript中动态创建对象。这对于在必要时延迟对象的实例化非常有用,从而缩短应用程序启动时间。它还允许动态创建视觉对象并将其添加到场景中,以响应用户输入或其他事件

动态创建对象的方法:

  • 调用Qt.createComponent()来动态创建Component对象
  • 使用Qt.createQmlObject() 从QML字符串创建对象,
  • 如果在 QML 文档中定义了现有组件,并且希望动态创建该组件的实例,则创建组件会更好。否则,当对象 QML 本身在运行时生成时,从 QML 字符串创建对象很有用。

动态创建组件:

要动态加载 QML 文件中定义的组件,请在 Qt对象中调用 Qt.createComponent() 函数。此函数将 QML 文件的 URL 作为其唯一参数,并从此 URL 创建Component对象。

拥有组件之后,可以调用createObject()函数创建该组件的一个实例,此函数可以接收一个或两个参数:

  1.  指定新对象的父对象:父对象可以是图形对象或非图形对象。只有具有图形父对象的图形对象才会渲染到 QtQuick 可视化画布。如果您希望稍后设置父级,则可以安全地设置null作为函数参数。 
  2. (可选参数)是定义对象的初始任何属性值的属性-值对的映射。此参数指定的属性值在对象创建完成之前应用于对象,从而避免在必须初始化特定属性以启用其他属性绑定时可能发生的绑定错误。此外,与在创建对象后定义属性值和绑定相比,性能优势很小。

使用时需要注意的情况: 

 QML文件可以有两种:

  1. 本地文件的话可以直接创建实例,不需要等待
  2. 如果是网上加载的文件的话,需要判断component的状态,就绪后才能创建实例

创建一个 myWidget.qml文件

import QtQuick 2.9Rectangle{width: 100;height: 100;color: "red"
}

主qml文件

import QtQuick 2.9
import "textJs.js" as Logic//导入js文件
import QtQuick.Window 2.2Window {id:window1visible: truewidth: 640height: 480title: qsTr("Hello World")Rectangle{id:appWindowwidth: 300;height: 300color: "lightBlue"Component.onCompleted: Logic.createSpriteObjects()//调用函数}}

textJs.js文件

var component;//接收创建的对象
var sprite;//接收实例function createSpriteObjects() {component = Qt.createComponent("myWidget.qml");//创建一个对象if (component.status == Component.Ready)//如果就绪finishCreation();//直接创建实例elsecomponent.statusChanged.connect(finishCreation);//等待就绪后创建实例
}function finishCreation() {if (component.status == Component.Ready) {sprite = component.createObject(appWindow, {x: 100, y: 100});//创建实例if (sprite == null) {// Error Handlingconsole.log("Error creating object");}} else if (component.status == Component.Error) {// Error Handlingconsole.log("Error loading component:", component.errorString());}
}

运行结果 :

从字符串中创建对象:

QML 直到运行时才定义,则可以使用 Qt.createQmlObject() 函数从 QML 字符串创建 QML 对象

Qt.createQmlObject(参数1,参数2,参数3) 

  •  参数1:创建的QML字符
  • 参数2:父类
  • 参数3:要与新对象关联的文件路径;这用于错误报告
var newObject = Qt.createQmlObject
('import QtQuick 2.0; Rectangle {color: "red"; width: 20; height: 20}',parentItem,"dynamicSnippet1");

维护动态创建的对象:

管理动态创建的对象时,必须确保创建上下文的寿命超过创建的对象。否则,如果首先销毁创建上下文,则动态对象中的绑定和信号处理程序将不再工作。

创建上下文取决于对象的创建方式:

  • 使用Qt.createComponent(),则创建上下文是调用此方法的QQmlContext
  • 使用Qt.createQmlObject(),则创建上下文是传递给此方法的父对象的上下文
  • 如果定义了一个Conponent{},然后在其上调了createObject(),创建上下文就是该Component

另外,请注意,虽然动态创建的对象可能与其他对象相同,但它们在 QML 中没有 id。

动态删除对象:

在许多用户界面中,将可视对象的不透明度设置为 0 或将可视对象移出屏幕而不是将其删除就足够了。但是,如果您有大量动态创建的对象,则删除未使用的对象可能会获得有价值的性能优势。

请注意,切勿手动删除由方便的 QML 对象工厂(如加载程序和转发器)动态创建的对象。此外,还应避免删除不是您自己动态创建的对象。

使用destroy()函数来删除对象,这个函数有一个可选的参数,可以用来设置在销毁该对象前的延迟时间(毫秒),默认为0。

例子:

application.qml

import QtQuick 2.0Item {id: containerwidth: 500; height: 100Component.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.0Rectangle {id: rectwidth: 80; height: 80color: "red"NumberAnimation on opacity {to: 0duration: 1000onRunningChanged: {if (!running) {  //当不在运行时console.log("Destroying...")rect.destroy();//销毁对象}}}
}

使用:Qt.createQmlObject()创建的对象同样可以使用destroy()销毁

var newObject = Qt.createQmlObject('import QtQuick 2.0; Rectangle {color: "red"; width: 20; height: 20}',parentItem,"dynamicSnippet1");
newObject.destroy(1000);

参考文档:

Dynamic QML Object Creation from JavaScript | Qt QML 5.15.12 

相关内容

热门资讯

安卓只恢复系统应用,重拾系统流... 你有没有遇到过这种情况?手机突然卡顿,或者某个应用突然罢工,你一气之下,直接开启了“恢复出厂设置”大...
安卓系统出现支付漏洞,揭秘潜在... 你知道吗?最近安卓系统可是闹出了不小的风波呢!没错,就是那个我们每天离不开的安卓系统,竟然出现了支付...
苹果换了安卓系统恢复,体验变革... 你有没有遇到过这种情况?手机里的苹果突然变成了安卓系统,而且还是那种让你摸不着头脑的恢复模式。别急,...
安卓怎么卸载系统app,轻松告... 手机里的系统应用越来越多,有时候真的让人眼花缭乱。有些应用虽然看起来很实用,但用起来却发现并不适合自...
安卓系统查看步数,揭秘日常运动... 你有没有发现,每天手机里的小秘密越来越多?今天,咱们就来聊聊安卓系统里那个悄悄记录你每一步的小家伙—...
安卓系统未来会不会,未知。 你有没有想过,那个陪伴我们手机生活的安卓系统,它的未来会怎样呢?想象每天早上醒来,手机屏幕上跳出的信...
安卓系统怎么设置截图,轻松捕捉... 亲爱的手机控们,你是不是也和我一样,有时候想记录下手机屏幕上的精彩瞬间呢?别急,今天就来手把手教你如...
安卓系统下载软件安装,安卓系统... 你有没有发现,手机里的安卓系统就像一个巨大的宝藏库,里面藏着各种各样的软件,让人眼花缭乱。今天,就让...
安卓10系统转移程序,轻松实现... 你有没有想过,当你从一台安卓手机升级到安卓10系统后,那些珍贵的照片、联系人、应用和数据怎么才能无缝...
安卓电脑强制重启系统,原因解析... 你有没有遇到过这种情况?你的安卓电脑突然间就强制重启了,屏幕上闪过一行行代码,你还没来得及保存文件,...
安卓怎么降低系统耗电,深度解析... 手机电量总是不够用,是不是你也和我一样,每天都要担心手机没电呢?别急,今天就来教你怎么给安卓手机降耗...
安卓系统的总体框架,架构与核心... 你有没有想过,你的手机里那个神奇的安卓系统,它到底是怎么运作的呢?今天,就让我带你一探究竟,揭开安卓...
谁的安卓系统好,谁家的安卓系统... 说到安卓系统,这可是个热门话题呢!你有没有想过,这么多安卓手机品牌,哪个的操作系统最让你心动?今天,...
安卓系统信付通,安全无忧的移动... 你知道吗?在安卓手机的世界里,有一个超级好用的支付工具,它就是信付通。今天,就让我带你来全方位了解一...
小米官方系统安卓包,深度解析与... 亲爱的数码爱好者们,你是否曾为手机系统而烦恼?市面上那么多手机品牌,各种操作系统让人眼花缭乱。今天,...
自制安卓手机双系统,自制安卓手... 你有没有想过,自己的手机可以同时运行两个操作系统呢?没错,就是那种安卓手机双系统!听起来是不是很酷?...
小米安卓系统怎么设置,科技前沿... 小米手机的用户们,是不是觉得安卓系统有点复杂,设置起来有点头疼呢?别担心,今天就来手把手教你如何轻松...
点歌系统支持安卓系统么,安卓用... 你有没有想过,在手机上点歌听歌,是不是也能像在KTV里那样随心所欲呢?现在,就让我来告诉你一个超级酷...
原版安卓系统刷机,解锁无限可能 你有没有想过,你的安卓手机其实可以焕然一新?没错,就是那种原汁原味的安卓系统,让你的手机重新找回当初...
欧尚改装安卓系统,打造智能驾驶... 你有没有想过,你的欧尚汽车其实也可以变身成为智能座驾呢?没错,就是那个你每天上下班的伙伴——欧尚,现...