【发布时间】:2022-10-17 13:11:23
【问题描述】:
假设我在 QML 中有以下对话框:
import QtQuick
import QtQuick.Controls
Dialog
{
title: "Bot Settings"
modal: true
standardButtons: Dialog.Ok | Dialog.Cancel
property var bot1
onAccepted: {}
onRejected: {}
Component.onCompleted: {}
Component.onDestruction: {}
}
我用这样的代码创建它:
function openBotDialog()
{
var dynamicComp = Qt.createComponent("BotDialog.qml")
var dynamicDlg = dynamicComp.createObject(mainWindow, {"bot1" : bot});
dynamicDlg.open()
}
我需要在对话框关闭时销毁它。
我使用什么代码以及在哪里添加它?
我应该销毁dynamicComp吗?
查看app with my dialog on GitHub 的完整源代码。
编辑1
当我在我的应用程序中按下以下按钮时,GC 不会破坏对话框:
但是,当我按下显式调用destroy() 方法的“清除动态Dlg”按钮时,对话框被销毁并调用其Component.onDestruction 处理程序。
Button
{
text: "Clear Dynamic Dlg"
onClicked:
{
dynamicComp.destroy()
dynamicComp = null
dynamicDlg.destroy()
dynamicDlg = null
}
}
【问题讨论】:
-
你永远不应该自己销毁对象,它是 Javascript 有一个垃圾收集。阅读更多here
-
@folibis 你确定吗?从您的链接:每个实例运行一个 NumberAnimation,当动画完成时,调用其根对象的 destroy() 以销毁自身。我不应该做这样的事情吗?
-
@folibis 使用我的示例应用程序自己测试它,请参阅 EDIT1。
-
你可以这样做,但你不应该这样做。当对象不再使用时,有一个垃圾收集旨在自动执行此操作。
-
@folibis 无法确定我创建的对话框何时停止使用,它可能永远不会在我的应用程序中发生。当我在对话框关闭后调用
gc()时,它不会被破坏。我试图等待一段时间并致电gc(),但没有成功。