у меня есть Loader
объект, который загружает некоторые очень тяжелые компоненты. Некоторое событие происходит в середине загрузки, которая требует загрузки, чтобы остановить и вернуться, чтобы очистить Loader
, Является ли это возможным?
Прервать создание объекта
Как задокументировано Qt, существует три метода для выгрузки / прерывания создания объекта:
Loader.active
в false
Loader.source
в пустую строкуLoader.sourceComponent
в undefined
Асинхронное поведение
Чтобы иметь возможность изменять эти свойства во время загрузки, Loader.asynchronous
должно быть true
иначе поток GUI занят загрузкой объекта. Вам также нужно QQmlIncubationController
для тебя QQmlEngine
контролировать время простоя, использованное для инкубации объекта. Без такого контроллера Loader.asynchronous
не имеет никакого эффекта. Обратите внимание, что QQmlApplicationEngine
автоматически устанавливает контроллер по умолчанию, если сцена содержит QQuickWindow
,
ошибки
До последней протестированной версии Qt (Qt 5.8.0, 5.9.0 beta) существенные утечки памяти существуют при прерывании незавершенной инкубации объекта (по крайней мере, в некоторых случаях, включая пример в ответе derM), что приводит к быстрой увеличение использования памяти для больших компонентов. сообщение об ошибке создается в том числе предлагаемое решение.
Я не знаю, каков ваш выпуск, с этими объекты, которые уничтожаются до окончания загрузки, а может проблема тут есть? Если нет, это должно работать:
Если это не поможет, пожалуйста, добавьте код к вашему вопросу, который воспроизводит вашу проблему.
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))
}
}
}
}