Загрузчик QML: установите свойство «источник:» один и только один раз

#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 достаточно простым. Я принимаю ваше решение.