Как прервать загрузку компонента в Loader?

у меня есть Loader объект, который загружает некоторые очень тяжелые компоненты. Некоторое событие происходит в середине загрузки, которая требует загрузки, чтобы остановить и вернуться, чтобы очистить Loader, Является ли это возможным?

4

Решение

Прервать создание объекта

Как задокументировано 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), что приводит к быстрой увеличение использования памяти для больших компонентов. сообщение об ошибке создается в том числе предлагаемое решение.

6

Другие решения

Я не знаю, каков ваш выпуск, с этими объекты, которые уничтожаются до окончания загрузки, а может проблема тут есть? Если нет, это должно работать:
Если это не поможет, пожалуйста, добавьте код к вашему вопросу, который воспроизводит вашу проблему.

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

По вопросам рекламы [email protected]