Мы разрабатываем кроссплатформенное приложение QT. Приложение имеет множество функциональных экранов и навигации. Для простоты работы с экранами мы используем QT QML StackView. Каждый предмет выдвинут StackView
является страница. Я использую следующую функцию для нажатия и всплывающих экранов.
stackview.push(someurl); //push new url
stackview.pop(); //pop current URL or page
Мой вопрос: как мы можем повторно использовать компоненты / страницы, уже помещенные в стек?
Пример : У меня есть следующие экраны A, B, C, D. Стек выглядит как A-> B-> C-> D. Теперь с экрана D я хочу перейти на экран A. Из-за единой архитектуры приложения я не хочу делать это 3 раза pop()
Вместо этого приложение должно повторно использовать уже нажатый Экран A и довести его до верха.
Мы можем просто нажать на экран А StackView
(A-> B-> C-> D-> A), но мы подключаем разные сигналы / слоты к / с каждого экрана, и не рекомендуется устанавливать соединение при каждом нажатии на экран, также не хотим вырастить приложение StackView
размер.
Какой будет лучший подход для использования в этом случае? Любой другой компонент / элемент управления QT, который я могу использовать в этом случае, чтобы я мог отображать страницы в зависимости от индекса?
Мы попытались создать компонент заранее, так как Свойство qml и нажмите его в зависимости от URL. Это полезно сработало в примере приложения. но в нашем приложении данные компонента QML тесно зависят от данных C ++ (или некоторых вычислений во время выполнения). Приложение вызывает сбой, если мы создаем компонент заранее. Поэтому мы не хотим использовать этот подход.
property Page page1: Screen1{} //Screen1.qml
property Page page2: Screen2{} //Screen2.qml
property Page page3: Screen3{} //Screen3.qml
property Page page4: Screen4{} //Screen4.qml
Можно ли положить компонент Stackview на основе индекса, я не нахожу ничего связанного с этим в документах.
Из-за единой архитектуры приложения я не хочу делать pop три раза, вместо этого приложение должно повторно использовать уже нажатый экран A и вывести его наверх.
Вам не нужно вызывать pop () три раза, чтобы вернуться к A. Согласно documentation
:
Элемент pop (Item item = undefined)
[…]item: если указано, все элементы вплоть до (но не включая) элемента будут удалены. Если элемент равен нулю, все элементы вплоть до (но не включая) первого элемента будут выталкиваться. Если не указано, будет добавлен только текущий элемент.
Только звонок pop(null)
один раз, чтобы ваш стек пошел к первому толчку.
Другой возможный подход заключается в использовании StackLayout
которые позволяют отображать компоненты QML на основе индекса.
StackLayout {
id: layout
Screen1 {}
Screen2 {}
Screen3 {}
Screen4 {}
}
Затем вы можете выбрать, какой экран появится, изменив currentIndex
имущество : layout.currentIndex = 1 // display Screen2
Других решений пока нет …