Как стать автором
Обновить

Комментарии 16

tass, хорошая статья и хорошо показывает возможности QML, но я все же добавлю каплю дёгтя.
а больше преследует цель показать, что QML является очень гибким и простым средством разработки.

Я считаю, что это заявление, которое проскальзывает в каждом посте есть попытка выдать желаемое за действительное. Я бы сказал по другому: QML должен стать очень гибким и простым средством разработки. Сейчас он сырой, очень сырой. И когда дело доходит до сложной логики, то доходит до таких танцев с бубном, что «сложный» C++ нервно курит в стороне.
Поясню: к примеру, попробуйте добавить к примеру выше, анимацию перемешивания элементов, когда вы делаете drop сохранив, при этом, функционал Flickable части GridView. Будет очень весело, да вот только сделать это надежно,невозможно с QtQuick 1.1.
Отдельного внимания заслуживают MouseArea, которые не умеют игнорировать события, для того, чтобы нижележащие элементы могли их обработать. Эта особенность раскрасит ваши серые будни, т.к. вам придется выдумывать недюжинные способы, чтобы это обойти.
Да и по мелочам там всякого хватает…
При этом, я не агитирую против QML, наоборот, это замечательная технология. Просто нужно будь в курсе, что многие вещи придется делать через ж… или писать свой элемент на C++ с последующим его экспортированием в QML(наличие такой возможности есть несомненный плюс QML)

Комментарий размещен скорее для читателей, а не автора, т.к. я уверен, что автор и без моего комментария это знает.
P.S.
и манипулируя свойством interactive

лучше манипулировать свойством preventStealing из MouseArea это позволит сохранить возможность прокрутки колесом.
О, грамотный коммент, спасибо :) почему таких же не было к предыдущим постам?
Пойдем по пунктам :)

1. «попробуйте добавить к примеру выше, анимацию перемешивания элементов, когда вы делаете drop сохранив, при этом, функционал Flickable части GridView». Я не пробовал, но есть другая реализация от ДнД на кумле от xsacha, у которого реализовано перемешивание.
2. «Отдельного внимания заслуживают MouseArea, которые не умеют игнорировать события, для того, чтобы нижележащие элементы могли их обработать. Эта особенность раскрасит ваши серые будни, т.к. вам придется выдумывать недюжинные способы, чтобы это обойти.» О да, этого действительно нет. Впрочем, мне в таких случаях помогает таймер с единичным интервалом, который дисаблит текущую маусэрию, вызывает плюсовый метод (в котором происходит проброс еще одного маусевента на сцену), енаблит маусэрию. Не спорю что костыль, но работает. В QtQuick2.0 вроде обещали починить, не особо следил за этим issue на трекере
3. «лучше манипулировать свойством preventStealing из MouseArea это позволит сохранить возможность прокрутки колесом» Не согласен. Скролл не будет работать на тачскринах.

Я бы не сказал что qml сырой (благо, я написал на нем уже немало, так что могу считать себя уже более менее знающим человеком), он просто хитрый и слегка другой, нежели все другие средства разработки
1. У xsacha реализован элементарный пример, который основан на, том, что элементы грида реально не являются его детьми. Там хитро сделано, но этот метод не работает, когда нужен грид с возможность прокручивания(к примеру прокрутка поля при поднесении элемента к краю, как в windows explorer). Это реализовать можно, но только с таймером, который должен быть достаточным, чтобы закончилась анимация. При этом его достаточность будет разниться на разных машинах, что может создать рывкуи на некоторых машинах. Иначе на экране будет картина, не отражающая действительность. В общем там хватает проблем с этим.
3. Будет работать, я имел ввиду не перманентное включение этого свойства, а его использование на время перетаскивания элемента.
1. Мб. Никогда не задумывался об этом. И этот пример более академический. Ни разу не сталкивался с ДнД в кумле. С хитрыми манипуляциями с mousearea сталкивался, а вот днд использовать в проектах не приходилось.
3. А, ну тогда да. Но тогда оно должно по идее идти в паре с interactive? Ведь иначе грид будет прокручиваться при движении мыши при драге (не только у краев, а везде).
Нет, не будет. Grid не получит события мышиного, и реагировать не на что будет.
Никогда им не пользовался, но смущает вот это
Note that setting preventStealing to true once an element has started stealing events will have no effect until the next press event.

Хотя по идее по propogate дндшная эрия должна получить его первой и грид не успеть украсть.
Я делал так: распознаю начало драга(по таймеру) и выставляю preventStealing. Тогда все последующие position change уже не дойдут до грида. В release устанавливаем preventStealing в false. Таким образом мы можем крутить грид колесом, когда тащим элемент. Мелочь, а приятно :) По крайней мере я, как пользователь, ожидаю такой функциональности от прокручиваемой области.
Добавил в заметки.
Может подскажите как в GridView задать фиксированное количество столбцов, чтобы была как вертикальная так и горизонтальная прокрутка?
PS: Извиняюсь если это оффтоп.
Насколько мне известно — никак :) этого нет by design. GridView скорее стоит расценивать не как полноценный грид, а как Flow с моделью и прокруткой
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
это все же написано не на qml, а на meegotouchframework :) по мне писать такое на qml — зряшная трата времени
НЛО прилетело и опубликовало эту надпись здесь
ну исторически этот код происходит из той же ветки форума ДевНета, что и у xsacha :) только мы пошли в разных направлениях. А сейчас как раз возникла необходимость в этом коде (попросил один знакомый его), я его слегка допилил и написал по нему статью.

По поводу маусЭрий. Всегда можно обойти через способ который я писал выше, но это безусловно костыль.
А чем ListView отличается, принципиально?
В QML 2 drag'n'dropa: встроенный и тот, что описан в статье(можно варьировать немного, но суть таже). Первый для простейших случаев и последний покрывает все остальное.
ну я думаю что имелись в виду все *View
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории