четверг, 6 марта 2014 г.

Миф о переходе Qt с C++ на QML

В сети уже давно циркулируют слухи, а точнее миф о том, что Qt перейдёт с С++ на QML, и весь код, написанный на С++ якобы будет объявлен deprecated. Эти слухи появились из статьи Ларса Нолла опубликованной здесь. Из этой статьи следует следующее:
  • Qt5 поддерживает и будет поддерживать C++ widgets, они не будут объявлены derprecated;
  • C++ виджеты объявлены как законченный модуль, новые возможности на данный момент никто не добавляет, но это не значит, что он заброшен и deprecated;
  • QML - дополнительный способ создания приложений;
  • QML - технология, ориентированная на будущее;
То есть C++ остаётся основным методом написания приложений, а QML просто даёт дополнительный метод создания приложений, часто - для мобильных платформ.

От себя добавлю несколько гадостей о QML (если быть точным, то о Quick), которые могут предотвратить ваш переход на него:
  • QML - довольно простая и ограниченная технология, сложные проекты будут представлять собой спагетти из QML и C++;
  • QML зависит от 2d-ускорения и качества видеодрайверов. Не удивляйтесь, что ваше окошко при быстром перемещении по рабочему столу начнёт чудовищно искажаться - это вина драйверов, то есть то, что вы не сможете починить. При отсутствии 2d-ускорения QML начинает серьёзно тормозить;
  • В QML до сих пор нет некоторых виджетов, которые вы использовали в C++, например дерева или диалогов. Вам придётся искать сторонние варианты реализации таких компонентов, либо писать их самим;
  • В QML компонентах, которые отображают данные, вроде TableView, нет поддержки сортировки, вам придётся в С++ коде создавать объект QSortFilterProxyModel с нужными переопределёнными виртуальными методами, и экспортировать его в QML;
  • В QML нет простого способа импортировать сложные С++ объекты, вам придётся писать дополнительный С++ код-обёртку чтобы передать сложный объект в QML;
  • периодически вы будете сталкиваться с разными недочётами и пользоваться костылями для их обхода (например, массивы в ListElement);
  • в QML нельзя передать любой enumerator из C++. Для этой операции вам потребуется выполнить несколько условий, а именно: 1) enum должен быть объявлен внутри QObject класса 2) внутри этого же класса должны быть объявления Q_OBJECT и Q_ENUMS(). Если вы используете чужие заголовочные файлы с enum-ами, то как вы сами понимаете, сделать их доступными в QML не получится. Самый прямой способ - дублирование объявления значений из enum-a в QML. Самый кривой - различные хаки с moc, работоспособность которых мне, к сожалению, неизвестна;