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

时间:2017-04-12 13:36:20

标签: c++ qt qml loader qqmlcomponent

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

2 个答案:

答案 0 :(得分:6)

中止对象创建

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

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

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

    <强>错误

    直到上一次测试的Qt版本(Qt 5.8.0,5.9.0 beta),在中止未完成的对象孵化时存在严重的内存泄漏(至少在某些情况下,包括derM答案中的示例)在大型组件的快速内存使用增加。创建bug report,包括建议的解决方案。

答案 1 :(得分:2)

我不知道你的issu是什么,那些在加载器完成之前被销毁的对象,但问题可能就在那里了?如果没有,这应该工作: 如果它没有帮助,请在您的问题中添加一些代码,以便重现您的问题。

<强> 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))
            }
        }
    }
}