QML中动态删除对象
在许多用户界面中,将视觉对象的不透明度设置为0或将视觉对象移出屏幕而不是删除它就足够了。但是,如果有许多动态创建的对象,则删除未使用的对象可能会获得有价值的性能优势。
请注意,永远不要手动删除由便利QML对象工厂动态创建的对象(例如Loader和Repeater)。另外,应避免删除不是动态创建的对象。
可以使用destroy()
方法删除项目。此方法具有一个可选参数(默认为0),该参数指定要销毁对象之前的大概延迟(以毫秒为单位)。
这是一个例子。在application.qml
创建的五个实例SelfDestroyingRect.qml
组成部分。每个实例都运行NumberAnimation,动画结束后,调用destroy()
其根对象以销毁自身:
application.qml
import QtQuick 2.0 QtQuick 2.0 Item { { id: container width: 500; height: 100 Component.onCompleted: {onCompleted: { var component = var component = Qt.createComponent("SelfDestroyingRect.qml"); for (var i=0; (var i=0; i<5; i++) { i++) { var object = var object = component.createObject(container); object.x = ((object.width + 10) * i; }} }} }}
SelfDestroyingRect.qml
import QtQuick 2.0 QtQuick 2.0 Rectangle { { id: rect width: 80; height: 80 color: "red" NumberAnimation on NumberAnimation on opacity { { to: 0 duration: 1000 onRunningChanged: { { if (!(!running) { { console.log("Destroying...") rect.destroy(); }} }} }} }}
或者,application.qml
可以通过调用破坏创建的对象object.destroy()
。
请注意,在该对象内的对象上调用destroy()是安全的。不会在调用瞬时destroy()时销毁对象,而是在该脚本块的末尾与下一帧之间的某个时间清除对象(除非您指定了非零延迟)。
还要注意,如果SelfDestroyingRect
实例是这样静态创建的:
Item { SelfDestroyingRect { // ... } }
这将导致错误,因为对象只有在动态创建后才能动态销毁。
使用Qt.createQmlObject()创建的对象可以类似地使用销毁destroy()
:
var newObject = Qt.createQmlObject('import QtQuick 2.0; Rectangle {color: "red"; width: 20; height: 20}', parentItem, "dynamicSnippet1"); newObject.destroy(1000);
英文官方地址:https://doc.qt.io/qt-5/qtqml-javascript-dynamicobjectcreation.html#deleting-objects-dynamically