如何在Loader中中止加载组件?

问题描述 投票:0回答:2

我有一个

Loader
对象,可以加载一些非常重的组件。某些事件在负载中间到达,需要停止负载并返回以清空
Loader
。可以吗?

c++ qt qml loader qqmlcomponent
2个回答
10
投票

中止对象创建

正如 Qt 所记录的,存在三种方法来卸载/中止对象实例化:

  1. Loader.active
    设置为
    false
  2. Loader.source
    设置为空字符串
  3. Loader.sourceComponent
    设置为
    undefined

异步行为

为了能够在加载期间更改这些属性,

Loader.asynchronous
应为
true
,否则 GUI 线程正忙于加载对象。您还需要
QQmlIncubationController
为您的
QQmlEngine
控制用于对象孵化的空闲时间。如果没有这样的控制器
Loader.asynchronous
没有任何效果。请注意,如果场景包含 QQmlApplicationEngine
QQuickWindow
 会自动安装默认控制器。

错误:内存泄漏

直到最后一个测试的 Qt 版本(Qt 5.8.0、5.9.0 beta),中止未完成的对象孵化时存在严重的内存泄漏(至少在某些情况下,包括 derM 答案中的示例),导致大型组件的内存使用量快速增加。创建错误报告,其中包括建议的解决方案。

根据错误报告,这应该在 Qt 版本 5.15 中修复(未测试)。


2
投票

我不知道你的问题是什么,那些在加载程序完成之前被销毁的对象,但也许问题就在那里?如果没有,这应该有效: 如果没有帮助,请在您的问题中添加一些代码,以重现您的问题。

main.qml

import QtQuick 2.7 import QtQuick.Controls 2.0 ApplicationWindow { id: root visible: true width: 400; height: 450 Button { text: (complexLoader.active ? 'Loading' : 'Unloading') onClicked: complexLoader.active = !complexLoader.active } Loader { id: complexLoader y: 50 width: 400 height: 400 source: 'ComplexComponent.qml' asynchronous: true active: false // visible: status === 1 } BusyIndicator { anchors.fill: complexLoader running: complexLoader.status === 2 visible: running } }

ComplexComponent.qml

import QtQuick 2.0 Rectangle { id: root width: 400 height: 400 Grid { id: grid anchors.fill: parent rows: 50 columns: 50 Repeater { model: parent.rows * parent.columns delegate: Rectangle { width: root.width / grid.columns height: root.height / grid.rows color: Qt.rgba(Math.random(index), Math.random(index), Math.random(index), Math.random(index)) } } } }
    
© www.soinside.com 2019 - 2024. All rights reserved.