Russian Qt Forum

Qt => Qt Quick => Тема начата: juvf от Июнь 11, 2015, 09:47



Название: Как реализовать страницы?
Отправлено: juvf от Июнь 11, 2015, 09:47
Простая задача... не могу решить. Допустим в приложении есть 10 разных окон (страниц на весь экран). На главном окне 3 кнопки. по нажатию на кнопку нужно перейти на соответствующую страницу. На других станицах есть кнопки переходи на главную страинцу и на другие окна. Как это реализовывается в Qml? Через какие механизмы.... хотя бы теоретически...


Название: Re: Как реализовать страницы?
Отправлено: Old от Июнь 11, 2015, 10:15
Чисто теоретически. :)
Через механизмы скрытия - свойство visible.
Плюс к этому механизм состояний - states. В каждом состоянии только одно окно visible = true.


Название: Re: Как реализовать страницы?
Отправлено: juvf от Июнь 11, 2015, 13:53
Спасибо! В 5 минут сделал.


Название: Re: Как реализовать страницы?
Отправлено: kandrey от Июнь 12, 2015, 17:28
Есть еще компонент StackView. Можно также попробовать готовый каркас https://github.com/papyros/qml-material


Название: Re: Как реализовать страницы?
Отправлено: Отражение луны от Июнь 14, 2015, 05:14
Возможно, будет полезно. В соседней теме пояснял как сделать это наименее костыльным методом. В Вашем случае самих табов не будет, но логика остается той же. Делаете свойство visiblePage и присваиваете ему id того элемента, который должен быть виден в данный момент. Остальные будут скрываться автоматически за счет property binding. http://www.prog.org.ru/topic_28870_0.html


Название: Re: Как реализовать страницы?
Отправлено: BuRn от Июнь 14, 2015, 14:55
Чисто теоретически. :)
Через механизмы скрытия - свойство visible.
Не правильный имхо подход, элементы по прежнему будут существовать на сколько мне известно, я придерживаюсь мнения что нужно создавать объекты по мере их необходимости, ну что-то типа
onClicked: clickNext();
onClickNext:{
holder=page.createObject(topLayer)
}


Название: Re: Как реализовать страницы?
Отправлено: Old от Июнь 14, 2015, 15:00
Не правильный имхо подход, элементы по прежнему будут существовать на сколько мне известно
Ну если вспомнить  QStackedWidget, который применяют для подобного поведения на десктопе, то там все страницы существуют, а показывается только одна текущая.
Но я вовсе не настаиваю. :)


Название: Re: Как реализовать страницы?
Отправлено: BuRn от Июнь 14, 2015, 15:19
Не правильный имхо подход, элементы по прежнему будут существовать на сколько мне известно
Ну если вспомнить  QStackedWidget, который применяют для подобного поведения на десктопе, то там все страницы существуют, а показывается только одна текущая.
Но я вовсе не настаиваю. :)
Я думаю стоит различать "тяжеловатость" этих самых страниц, если на странице 2 кнопки, бесспорно проще сделать визибл/инвизибл, а вот если страница посерьезнее, я бы конечно создавал объекты.


Название: Re: Как реализовать страницы?
Отправлено: Old от Июнь 14, 2015, 15:27
Я думаю стоит различать "тяжеловатость" этих самых страниц, если на странице 2 кнопки, бесспорно проще сделать визибл/инвизибл, а вот если страница посерьезнее, я бы конечно создавал объекты.
Как раз две кнопки легко создавать динамически, а вот тяжелые страницы постоянно пересоздавать, может быть не быстро.
Хотя повторюсь, доказывать правильность я не буду. Оба подхода имеют право на жизнь и могут применяться в разных случаях.


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

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



Название: Re: Как реализовать страницы?
Отправлено: Отражение луны от Июнь 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 каждой из страниц. Вашей реализации конечно я не видел, выкладываю инфу чисто для справки.


Название: Re: Как реализовать страницы?
Отправлено: juvf от Июнь 16, 2015, 06:43
Типичная ошибка в этом случае (не то, чтобы прям ошибка, просто не удобно это)
Спасибо. Я уже эту ошибку сделал. Щя исправлю.


Название: Re: Как реализовать страницы?
Отправлено: Отражение луны от Июнь 16, 2015, 07:47
по мере их необходимости
Это когда знаешь, что объект будет использован 1 раз и потом он уже не понадобится. Или этот подход используется в ListView, где нет никакого смысла сразу пытаться создать по делегату на каждый элемент модели, т.к. это сильно затруднит обновление. А вот если юзер перелистывает страницы по своему усмотрению куда лучше иметь в памяти все и сразу. Объекты создаются не мгновенно, каждый раз создавать страничку заново = тормоза.
Да и если уж создавать, то через инкубатор, т.е. асинхронно.


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


Название: Re: Как реализовать страницы?
Отправлено: juvf от Июнь 16, 2015, 12:32
Да у меня страниц не много. И Qml я только осваиваю... для начала статики заглаза. Может в будущем и динамику освою.