7

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

4

2 回答 2

10

中止对象创建

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

  1. 设置Loader.activefalse
  2. 设置Loader.source为空字符串
  3. 设置Loader.sourceComponentundefined

异步行为

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

错误

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

于 2017-04-15T17:12:19.473 回答
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
    }
}

复杂组件.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))
            }
        }
    }
}
于 2017-04-12T15:28:02.200 回答