Pull to refresh

Comments 5

Огромное спасибо за статью, такого обзора очень сильно не хватало во время изучения QML. Хорошо бы еще добавить древовидный пример (как на скрине), причем может быть не на стандартном TreeView, потому что в новых контролах его нет и непонятно когда будет.

Еще один сложный момент — это управление памятью на стыке JS и C++, вот тут автор осветил тему, пытался разрулить, но переусложнил как по мне. Наверное проще всегда управлять объектами в C++, чтобы не было внезапных падений.

Как я понимаю, при использовании QQmlListProperty не получится повесить анимации на добавление и удаление объектов, только полная перезагрузка вьюхи, что не очень хорошо смотрится.

При этом у QAbstractListModel с ролями в классическом виде есть недостаток при использовании на мобильных платформах, когда мы хотим отредактировать какой-нибудь элемент списка на отдельном экране, нам придется создавать JS объект, заполнять его полями модели, передавать в редактор, потом в обратном порядке. Поэтому можно сделать модель с одной ролью, сразу отдающей наследника QObject с полями в Q_PROPERTY. Вот интересный вариант посыпанный сахаром.
Хорошо бы еще добавить древовидный пример (как на скрине), причем может быть не на стандартном TreeView, потому что в новых контролах его нет и непонятно когда будет.

TreeView можно реализовать при помощи обычного ListView, только нужна прокси-модель, которая из дерева сделает список.


При этом у QAbstractListModel с ролями в классическом виде есть недостаток при использовании на мобильных платформах, когда мы хотим отредактировать какой-нибудь элемент списка на отдельном экране, нам придется создавать JS объект, заполнять его полями модели, передавать в редактор, потом в обратном порядке.

Необязательно, можно выставить диалогу редактирования нужные параметры и потом показать его.
Кстати, можно использовать Q_GADGET для структуры данных и передавать ее как var в QML (нужно будет зарегистрировать этот тип).


Поэтому можно сделать модель с одной ролью, сразу отдающей наследника QObject с полями в Q_PROPERTY.

Тоже вариант, я когда-то так делал. Но есть много нюансов — например, мы же привязываемся к свойствам этого объекта и вызываем его методы в делегате. А значит, надо обрабатывать ситуации, когда объекта еще/уже нет. Если устанавливать обработчики на сигналы этого объекта, то могут быть всякие мутные ситуации, когда объект есть, обработчик сигнала тоже есть, а вот контекста, где вызван этот обработчик уже и нет (делегат был разрушен/очищен).


Я бы сказал, что лучше все-таки отдавать данные, если есть такая возможность.


Еще один сложный момент — это управление памятью на стыке JS и C++.

По умолчанию владение JavaScriptOwnership будет установлено, если явно вызываемый метод вернет QObject* без родителя. Т.е. для фабрики. Во всех остальных случаях, почему это у объекта вообще не установлен parent? :) На мой взгляд, тут вопрос проектирования.

Статья супер, как и весь цикл, жадно читал каждую часть.

Можно я бессовестно попиарюсь по поводу моделей? =)) Запилил небольшую либу для работы с JSON/XML REST используя Qt-модели и QML.

Поддерживает из коробки сериализацию JSON списочных данных, фильтрацию, сортировку, пейджинг и прочее. Точно совместима с Yii2-REST и Django REST API.

https://github.com/kafeg/qtrest
Отличный цикл статей! Афтар пиши ещё!!! Очень жалко, что не было такого, когда я только начинал разбираться с QML. Хотя, даже сейчас, полезно было почитать и разложить все знания по полочкам. QML на сколько прост снаружи, на сколько же сложен внутри.
Sign up to leave a comment.

Articles