#c #qml
#c #qml
Вопрос:
У меня есть окно, содержащее то, что я назвал Страницей — прямоугольник размером с главное окно:
LoginWindow {
id: loginWindow
}
SelectionWindow {
id: selectionWindow
}
ServiceWindow {
id: serviceWindow
}
ConfirmWindow {
id: confirmWindow
}
IssueWindow {
id: issueWindow
}
Каждое *Window здесь представляет собой элемент, наследуемый от Page.
Теперь я могу переходить между различными элементами страницы, настраивая их видимость. Одновременно может быть видна только одна страница. Последняя страница — IssueWindow, и оттуда я хочу вернуться к LoginWindow и выйти из системы пользователя.
Из C я выдаю сигнал Issue Finished, и в MainWindow у меня есть этот код:
onIssueFinished: {
// This line won't hide the Page
issueWindow.visible = false;
loginHandle.logout();
}
Как отмечено в комментарии, элемент Страницы просто не будет скрываться, в то время как другие элементы изменят свою видимость. Я использую GammaRay, чтобы увидеть изменения, и все работает, просто скрытие issueWindow этого не делает. Кроме того, при печати issueWindow.visible для консоли это значение равно false.
Комментарии:
1. Почему бы вам не использовать a
Loader
?2. @user2436719: загрузчик уничтожит экземпляры. Однако может оказаться необходимым сохранить экземпляры из-за отсутствия представления без состояния или наличия сложных представлений, для восстановления которых потребуется много времени. Если у вас достаточно памяти под рукой, это дает более реактивное ощущение, если вам не нужно ждать, чтобы повторно настроить страницу каждый раз, когда вы переключаетесь.
Ответ №1:
Используйте непрозрачность вместо видимости и привяжите один метод к изменению непрозрачности, который обрабатывает включенное и отключенное состояние, например.
onIssueFinished: {
// This line won't hide the Page
issueWindow.opacity = 0.0;
loginHandle.logout();
}
IssueWindow {
id: issueWindow
onOpacityChanged: {
enabled = ( opacity === 1.0)
}
}
Вам необходимо реализовать изменение непрозрачности во всех окнах.
И установите непрозрачность для всех остальных окон.
Или вы можете использовать stack view или swipe view .
Комментарии:
1. Спасибо за ответ, хотя это не решило проблему. В чем преимущество использования непрозрачности по сравнению с видимым?
Ответ №2:
Выяснилось, что проблема заключалась в неправильном порядке переключения видимости и запуска сигналов и реагирования на них.
Ответ №3:
Чтобы убедиться, что видна только одна страница, вы можете использовать индекс. Вы устанавливаете видимость на:
visible: (selected == thisPageIdentifier)
При этом вы убедитесь, что видна только страница с соответствующим идентификатором страницы, и вам не нужно использовать несколько сигналов для отображения и скрытия.
Когда новая страница станет видимой, просто установите selected
для свойства соответствующий идентификатор (int или string или что-либо еще), и другие страницы станут невидимыми.
Это должно повысить масштабируемость, поскольку у вас нет новых сигналов для обработки на всех других страницах, если вы решите добавить новую страницу один раз. Вам нужно только убедиться, что идентификатор уникален.
Ваш пример кода адаптирован к этому:
Item {
property int selection: 0
LoginWindow {
id: loginWindow
visible: (selection === 0)
}
SelectionWindow {
id: selectionWindow
visible: (selection === 1)
}
ServiceWindow {
id: serviceWindow
visible: (selection === 2)
}
ConfirmWindow {
id: confirmWindow
visible: (selection === 3)
}
IssueWindow {
id: issueWindow
visible: (selection === 4)
}
}