【问题标题】:Where do I destroy a Dialog if I create it dynamically?如果我动态创建对话框,我在哪里销毁它?
【发布时间】: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(),但没有成功。

标签: qt qml


【解决方案1】:

怎么样:

    onAccepted: Qt.callLater(destroy)
    onRejected: Qt.callLater(destroy)

这意味着您在接收到接受/拒绝的信号后安排销毁。 Qt.callLater 增加了足够的延迟,以便在信号处理程序期间而不是在之后立即进行破坏。

import QtQuick
import QtQuick.Controls
Page {
    id: thisPage
    Button {
        text: qsTr("Bot Dialog")
        onClicked: openBotDialog()
    }
    function openBotDialog()
    {
        var dynamicComp = Qt.createComponent("BotDialog.qml")
        var bot = new Date();
        var dynamicDlg = dynamicComp.createObject(thisPage, {"bot1" : bot});
       dynamicDlg.open()
    }
}

//BotDialog.qml
import QtQuick
import QtQuick.Controls
Dialog
{
    title: "Bot Settings"
    modal: true
    standardButtons: Dialog.Ok | Dialog.Cancel
    property var bot1
    onAccepted: Qt.callLater(destroy)
    onRejected: Qt.callLater(destroy)
}

你可以Try it Online!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多