Russian Qt Forum
Ноябрь 23, 2024, 08:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как реализовать страницы?  (Прочитано 7760 раз)
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« : Июнь 11, 2015, 09:47 »

Простая задача... не могу решить. Допустим в приложении есть 10 разных окон (страниц на весь экран). На главном окне 3 кнопки. по нажатию на кнопку нужно перейти на соответствующую страницу. На других станицах есть кнопки переходи на главную страинцу и на другие окна. Как это реализовывается в Qml? Через какие механизмы.... хотя бы теоретически...
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Июнь 11, 2015, 10:15 »

Чисто теоретически. Улыбающийся
Через механизмы скрытия - свойство visible.
Плюс к этому механизм состояний - states. В каждом состоянии только одно окно visible = true.
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #2 : Июнь 11, 2015, 13:53 »

Спасибо! В 5 минут сделал.
Записан
kandrey
Гость
« Ответ #3 : Июнь 12, 2015, 17:28 »

Есть еще компонент StackView. Можно также попробовать готовый каркас https://github.com/papyros/qml-material
Записан
Отражение луны
Гость
« Ответ #4 : Июнь 14, 2015, 05:14 »

Возможно, будет полезно. В соседней теме пояснял как сделать это наименее костыльным методом. В Вашем случае самих табов не будет, но логика остается той же. Делаете свойство visiblePage и присваиваете ему id того элемента, который должен быть виден в данный момент. Остальные будут скрываться автоматически за счет property binding. http://www.prog.org.ru/topic_28870_0.html
« Последнее редактирование: Июнь 14, 2015, 05:18 от Отражение луны » Записан
BuRn
Гость
« Ответ #5 : Июнь 14, 2015, 14:55 »

Чисто теоретически. Улыбающийся
Через механизмы скрытия - свойство visible.
Не правильный имхо подход, элементы по прежнему будут существовать на сколько мне известно, я придерживаюсь мнения что нужно создавать объекты по мере их необходимости, ну что-то типа
onClicked: clickNext();
onClickNext:{
holder=page.createObject(topLayer)
}
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Июнь 14, 2015, 15:00 »

Не правильный имхо подход, элементы по прежнему будут существовать на сколько мне известно
Ну если вспомнить  QStackedWidget, который применяют для подобного поведения на десктопе, то там все страницы существуют, а показывается только одна текущая.
Но я вовсе не настаиваю. Улыбающийся
Записан
BuRn
Гость
« Ответ #7 : Июнь 14, 2015, 15:19 »

Не правильный имхо подход, элементы по прежнему будут существовать на сколько мне известно
Ну если вспомнить  QStackedWidget, который применяют для подобного поведения на десктопе, то там все страницы существуют, а показывается только одна текущая.
Но я вовсе не настаиваю. Улыбающийся
Я думаю стоит различать "тяжеловатость" этих самых страниц, если на странице 2 кнопки, бесспорно проще сделать визибл/инвизибл, а вот если страница посерьезнее, я бы конечно создавал объекты.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Июнь 14, 2015, 15:27 »

Я думаю стоит различать "тяжеловатость" этих самых страниц, если на странице 2 кнопки, бесспорно проще сделать визибл/инвизибл, а вот если страница посерьезнее, я бы конечно создавал объекты.
Как раз две кнопки легко создавать динамически, а вот тяжелые страницы постоянно пересоздавать, может быть не быстро.
Хотя повторюсь, доказывать правильность я не буду. Оба подхода имеют право на жизнь и могут применяться в разных случаях.
« Последнее редактирование: Июнь 14, 2015, 15:40 от Old » Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #9 : Июнь 15, 2015, 08:03 »

Есть еще компонент StackView.
Это же обычный стек. с обычными pop и push. Зачем он здесь? запихнул туда странички 1,2,3,4,5.... текущая (видимая) 5-ая. потом нужно с 5-ой переключиься на 2-ую, потом на 4-ую, потом на 1-ую. Как это стеком делать со стеком?

Цитировать
В соседней теме пояснял как сделать это наименее костыльным методом.
Через ListView/ListModel, пробовал, не получается.... какой-то оверинженеринг... да ещё и не работает толком... наверно руки нe из нужного места растут.

« Последнее редактирование: Июнь 15, 2015, 08:38 от juvf » Записан
Отражение луны
Гость
« Ответ #10 : Июнь 15, 2015, 15:29 »

Через ListView/ListModel, пробовал, не получается.... какой-то оверинженеринг... да ещё и не работает толком... наверно руки нe из нужного места растут.
Не, в Вашем случае не нужен никакой ListView/ListModel, в том примере они - часть вкладок, которые Вам не нужны. Естественно LisrView не подходит для этой задачи ровным счетом никак)
Все что Вам нужно - назначить property у родителя страниц, содержащую ссылку на текущую отображаемую страницу, и на всех страничках прописать зависимость visible от этого значения. Типичная ошибка в этом случае (не то, чтобы прям ошибка, просто не удобно это) писать вот так:
Код:
page1.visible = false;
page2.visible = false;
page3.visible = true;
...
когда можно написать
Код:
pagectl.visiblePage = page3;
а во всех страничках сделать биндинг
Код:
visible: (pagectl.visiblePage==<id этой страницы>)

Это будет работать лучше и использовать это удобнее, чем всякие states и ручное модифицирование visible каждой из страниц. Вашей реализации конечно я не видел, выкладываю инфу чисто для справки.
« Последнее редактирование: Июнь 15, 2015, 15:31 от Отражение луны » Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #11 : Июнь 16, 2015, 06:43 »

Типичная ошибка в этом случае (не то, чтобы прям ошибка, просто не удобно это)
Спасибо. Я уже эту ошибку сделал. Щя исправлю.
Записан
Отражение луны
Гость
« Ответ #12 : Июнь 16, 2015, 07:47 »

по мере их необходимости
Это когда знаешь, что объект будет использован 1 раз и потом он уже не понадобится. Или этот подход используется в ListView, где нет никакого смысла сразу пытаться создать по делегату на каждый элемент модели, т.к. это сильно затруднит обновление. А вот если юзер перелистывает страницы по своему усмотрению куда лучше иметь в памяти все и сразу. Объекты создаются не мгновенно, каждый раз создавать страничку заново = тормоза.
Да и если уж создавать, то через инкубатор, т.е. асинхронно.
Записан
BuRn
Гость
« Ответ #13 : Июнь 16, 2015, 10:58 »

по мере их необходимости
Это когда знаешь, что объект будет использован 1 раз и потом он уже не понадобится. Или этот подход используется в ListView, где нет никакого смысла сразу пытаться создать по делегату на каждый элемент модели, т.к. это сильно затруднит обновление. А вот если юзер перелистывает страницы по своему усмотрению куда лучше иметь в памяти все и сразу. Объекты создаются не мгновенно, каждый раз создавать страничку заново = тормоза.
Да и если уж создавать, то через инкубатор, т.е. асинхронно.
Соглашусь, но придерживаюсь мнения, что если страниц много и они тяжелые, я бы создавал их по мере необходимости, ибо зачем расходовать ресурсы на страницы, создавая их все, если некоторые мб вовсе не понадобятся.
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #14 : Июнь 16, 2015, 12:32 »

Да у меня страниц не много. И Qml я только осваиваю... для начала статики заглаза. Может в будущем и динамику освою.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 23.