#binding #qml #qt5 #loader
Вопрос:
Доброе утро, все,
Я должен поддерживать существующее приложение QML (которое я не могу полностью переписать), и нам нужно отложить загрузку большинства страниц, чтобы запуск приложения был быстрее.
т. е.: Мне нужно загрузить страницу, один и только один раз, в какой-то момент, и мне нужно сохранить ее загруженной позже (для этого у меня более чем достаточно оперативной памяти).
Итак, я подумал, что мог бы написать что-то вроде этого:
Loader {
id: _userInfoLoader;
source: (status != Loader.NULL || Global.currMenuId == MenuIds.SETTINGS) ? "pages/PageUserInfo.qml" : "" ;
}
Этот код предназначен для загрузки страницы «Информация о пользователе» при открытии страницы «Настройки» (т. е. когда переменная модели Global.currMenuId == НАСТРОЙКИ)
(примечание: страница «Информация о пользователе» является подстраницей страницы «Настройки», поэтому ее достаточно загрузить, когда отображается «родительская страница»).
Как только эта страница «Информация о пользователе» будет загружена, ее статус больше не будет нулевым, она будет «Готова», «Загрузка» или «Ошибка», поэтому свойство «источник:» никогда больше не должно изменяться после его установки.
Поступая так, я получаю страшную ошибку :
QML Loader: Binding loop detected for property "source"
Ты знаешь, как это исправить? Заранее спасибо за ваши мысли…
Ответ №1:
Я думаю, что цикл Global.currMenuId == MenuIds.SETTINGS
истинен -> > source
установлен -> > status
обновлен-> > source
установлен снова -> > status
обновлен снова -> > source
установлен снова ….
Если вы хотите, чтобы это было сделано один раз и только один раз, вы можете использовать Connections
и процедурный код:
Loader {
id: _userInfoLoader;
Connections {
target: Global
onCurrMenuIdChange: {
if (!_userInfoLoader.source amp;amp; Global.currMenuId == MenuIds.SETTINGS) {
_userInfoLoader.source = "pages/PageUserInfo.qml";
}
}
}
}
Комментарии:
1. Спасибо. Это работало, сохраняя исходный код QML достаточно простым. Я принимаю ваше решение.