Представляю доказательства возможности портировать Qt Lighthouse на iOS (UIKit) (original) (raw)

Я закончил реализацию тестового порта Lighthouse плагина, котрый работает «поверх» UIKit (исходный код доступен в репозиротии qt-lighthouse на гиториоусе). Пока не настолько впечатляющий, как порт под Android (но может быть немножечко более впечатляюще, чем порт под новую пратформу INTEGRITY, по крайней мере для меня).
image

А это значит, что если вы внимательно выполните все инструкции в прилагающемся README файле (который можно найти в ветке src/plugins/platforms/uikit/ репозитория qt-lighthouse), то сможете собрать (частично) Qt для iOS (как для симулятора, так и для устройств), а также запустить пару Qt Quick приложений из стандартных примеров. Обращаю ваше внимание, что это не настоящий порт на iOS и не имеет ни какой официальной поддержки или официального статуса. Существует огромная вероятность, что многие части Qt API не работают, даже те, которые успешно собрались (не говоря уже о тех, которые не удалось собрать).
В общем, цель данного R&D проекта заключалась в том, чтоб запустить парочку QML приложений на айфоне для проверки потенциальной возможности этой затеи вообще. Ну и конечно, чтоб показать насколько QML технология крута.

Сборка и линковка Qt

Это была самая утомительная часть, которая вначале сильно разочаровала. Я столкнулся с огромным количеством проблем, начиная с ошибок компилятора, связанных с тем, что некторые инструкции были недоступны, заканчивая тем, что значения функций и переменных внезапно менялись или обнулялись в рантайме. В итоге я обнаружил, что базовый mkspec (файл настроек сборки Qt) для gcc под мак содержал в себе специфичные для настольной версии Мак ОС значения окружения. Естественно это и взрывало мозг тулчайну от iOS. После этого я подправил переменные окружения в mkspec на более или менее правильные. И благодаря тому, что iOS по сути своей — это POSIX платформ, практически все сразу заработало.

Плагин для платформы Qt Lighthouse

Я выбрал самый легкий путь, и сделал так-же, как и в плагине для Cocoa: блитил backstore QImage на UIView (точнее на CALayer). Явно, это не самое оптимальное решение (и заметно не вооруженным глазом, если запустить QML flickr demo), но решение вполне соответсвует понятию «R&D проект». Хотя все-же была парочка проблем. Например, во время интеграции обработчика очереди событий (QEventLoop), система убивала iOS приложение, если во время обработки события управление не передавалось главному циклу приложения в определенные временные рамки.
Хорошим решением для отрисовки, было бы использовать OpenGL поверхность в качестве backstore в Qt. Тогда вся отрисовка бы происходила в эту поверхность. А в UIKit представить эту поверхность как буфер для CALayer соотвествующего UIView. Таким образом бы получился бы общий видеобуфер, в который бы Qt рисовал, а UIKit iOS подсистема бы воспринимала как «свой родной» и отрсиовывала его со всей своей иерархией, не особо разбираясь как туда и чего попало.

Результат

Lighthouse способен работать на iOS (как минимум после небольших патчей) и QML очень крутая технология :-). Ну и стоить подметить, что для Lighthouse — это полезный плагин, ну и плюс как минимум очень поучительный опыт.

Вот парочка видео-демо:

Qt Mobility на iOS — акселерометр используется для эмуляции глубины пространства:

QML интерфейс:

QGraphicScene

Очень хотелось бы, чтоб какая-нибудь коммерческая организация бы взялась за релизацию этого порта и представила миру (пусть даже за деньги) Lighthouse плагин, позволяющий писать коммерческие решения для iOS на Qt. Это бы в очередной раз подтвердило и укрепило слоган :«code less, create more and deploy everywhere».