У меня все экраны QML-приложения уложены в «основной» объект типа StackView.
Возникла задача запоминать, какой экран был при выключении приложения, и восстанавливать его при включении. Для простоты можно считать, что что есть первый экран «меню» (это initialItem), и из него возможен переход на экран «режим1» или на экран «режим2». Таким образом, после создания StackView, по сути надо сделать одну-единственную команду, например:
stackView.push( mode1StackComponent );
Проблема в том, что я не могу понять в как и в каком месте кода отловить момент создания экрана «меню», чтобы выполнить эту команду. Код примерно такой:
StackView {
id: stackView
anchors.fill: parent
focus: true
initialItem: mainMenuStackComponent
// Окно с основным меню
Component {
id: mainMenuStackComponent
MainMenu {
id: mainMenu
enabled: Stack.status === Stack.Active
}
}
// Окно режима 1
Component {
id: mode1StackComponent
Mode1 {
id: mode1
enabled: Stack.status === Stack.Active
}
}
// Окно режима 2
Component {
id: mode2StackComponent
Mode2 {
id: mode2
enabled: Stack.status === Stack.Active
}
}
}
Я пробовал добавлять код:
Component.onCompleted: {
stackView.push( mode1StackComponent );
console.warn("Auto call");
}
В блок с id:mainMenu, но тогда появляется ошибка:
qml: Warning: StackView: You cannot push/pop recursively!
__recursionGuard (file:///opt/qt_5_11_2/5.11.2/gcc_64/qml/QtQuick/Controls/StackView.qml:791)
push (file:///opt/qt_5_11_2/5.11.2/gcc_64/qml/QtQuick/Controls/StackView.qml:568)
onCompleted (qrc:/qmlCode/main.qml:77)
__loadElement (file:///opt/qt_5_11_2/5.11.2/gcc_64/qml/QtQuick/Controls/StackView.qml:825)
__performTransition (file:///opt/qt_5_11_2/5.11.2/gcc_64/qml/QtQuick/Controls/StackView.qml:911)
push (file:///opt/qt_5_11_2/5.11.2/gcc_64/qml/QtQuick/Controls/StackView.qml:605)
expression for onCompleted (file:///opt/qt_5_11_2/5.11.2/gcc_64/qml/QtQuick/Controls/StackView.qml:777)
qml: Auto call
Видимо, это связано с тем, что onCompleted() в QML не гарантирует создания подчиненных элементов к моменту своего срабатывания.
Поэтому не могу сообразить, как еще можно сделать автоматическое открытие «окна второго уровня» в StackView с помещением базового окна «меню» в стек.