Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Вячеслав от Июль 02, 2016, 11:24



Название: Помогите разобраться с делегатом.
Отправлено: Вячеслав от Июль 02, 2016, 11:24
Доброе время суток!
Начал тока изучать QT и QML и возникли вопросы которые к сожалению не нашел в интернете.

есть проект на QML в нет GridView (не на весь экран) которые отображает картинки.
мне надо при нажатии на картинку с эмитировать ее перемещение в правый крайний угол экрана при этом сама картинки из GridView никуда не девается.

попытался сделать это внутри делегата - понял что это у меня не получается в связи с не понятными параметрами координат внутри делегата.

сделал отдельный image - который должен наложится на отображение выбранной картинки и уже этот image перемещать.
но не пойму как определить расположение нужного делегата по отношении к экрану.

Заранее спасибо.

Может посоветуете другой вариант решения..


Название: Re: Помогите разобраться с делегатом.
Отправлено: Отражение луны от Июль 02, 2016, 17:55
Координаты внутри элемента считаются всегда относительно координат его родителя. То есть левых верхний угол - это 0,0, а нижний правый - width, height. Кроме того, это будет попросту выходом за пределы делегата. Т.е. это заведомо неправильное с точки зрения дизайна QML решение.
Как же поступить? На самом деле довольно просто. На клик:
1. Создаем свой экземпляр делегата, содержащего изображение, parent должен быть верхний элемент, содержащий всю форму, или же её часть так, чтобы анимация не выходила за границы этого элемента.  Для создания есть Component.createObject, то есть в твоем случае это будет что-то вроде myGridItemDelegate.createObject.
2. Устанавливаем ему координаты кликнутого делегата. Для того, чтобы получить правильные координаты относительно другого parentа используется mapToItem.
3. Устанавливаем все параметры делегата так, чтобы они соотвествовали параметрам кликнутого делегата. Ну то есть задаем картинку и прочие параметры. На этом этапе у нас получается 2 идентичных объекта, один лежит в gridе, второй над ним и принадлежит другому родителю.
4. Делаем видимым и анимируем. Для анимации используем SequentialAnimation. Чтобы одна анимация не перекрывала другую - анимации тоже придется создавать динамически, через createObject.  Первым делом запускаем любые нужные нам анимации, а затем пихаем туда ScriptAction, в котором вызываем destroy данного объекта и самой анимации. Готово.

На первый взгляд выглядит сложно, но на практике - раз плюнуть.


Название: Re: Помогите разобраться с делегатом.
Отправлено: Вячеслав от Июль 02, 2016, 18:24
походу вот это я и искал "mapToItem".

Большое спасибо.


Название: Re: Помогите разобраться с делегатом.
Отправлено: Вячеслав от Июль 03, 2016, 01:14
Все супер.
Все получилось.

СПАСИБО.