QML中能否为静态创建的Dialog调用destroy方法?
QML Dialog销毁场景分析
一、可行的写法
直接用Component包裹Dialog,在onClosed信号中调用destroy()是完全可行的:
Component { id: editDialogComp Dialog { onClosed: destroy() } }
二、嵌套Item的特殊场景
1. QML组件代码(SpecialDialog.qml)
如果把Dialog嵌套在Item内部,在Dialog的onClosed中调用destroy()是否可行?
Item { Dialog { anchors.fill: parent // ... 其他逻辑 onClosed: destroy() // 是否可行? } }
2. C++创建组件代码
通过以下C++代码实例化上述组件:
QQmlComponent component(engine, "SpecialDialog.qml"); auto* object = component.beginCreate(engine->rootContext()); component.completeCreate(); QQmlEngine::setObjectOwnership(object, QQmlEngine::JavaScriptOwnership);
3. 场景分析
- 直接在
Dialog的onClosed中调用destroy(),只会销毁Dialog自身,不会销毁外层的Item实例。因为destroy()默认作用于调用它的对象,也就是内部的Dialog,外层的Item仍会留在内存中,依然存在内存泄漏问题。 - 如果注释掉
destroy()调用,每次打开表单都会创建新的Dialog和外层Item,所有实例都要等到应用退出才会被销毁,会持续占用内存。
要彻底销毁整个组件实例,应该让外层Item响应Dialog的closed信号,然后调用自身的destroy():
Item { Dialog { anchors.fill: parent // ... 其他逻辑 onClosed: parent.destroy() } }
或者给外层Item设置id,明确调用其destroy():
Item { id: rootItem Dialog { anchors.fill: parent // ... 其他逻辑 onClosed: rootItem.destroy() } }
内容的提问来源于stack exchange,提问作者Vladimir Bershov
相关产品推荐
相关产品推荐

