Приветствую всех, кому интересна кроссплатформенная разработка для мобильных устройств! До недавнего времени относился с огромным скепсисом к инструментариям, позволяющим создавать ненативные приложения, которые работали бы сразу на ряде платформ. Однако в один момент любопытство и желание попробовать что-то новое всё же перевесили сдерживающий рассудок. Выбор пал на Qt 5.3. Почему? Потому что Qt открыт и бесплатен для некоммерческого использования, имеет продолжительную историю (вышел в свет в 1996 году) и достаточное количество качественных проектов (навскидку — Skype, приложения 2ГИС), реализованных с использованием данных библиотек.
Цель публикации — познакомить читателей с мобильной разработкой на последней версии Qt: показать реализацию основных элементов клиент-серверных приложений и осветить возможные «подводные камни» при работе с библиотеками Qt.
Требуемый уровень подготовки и опыта — минимальный (знание основ C++, элементарное умение конфигурации локального сервера).
Материал для удобства восприятия разбит на 4 части: «Подводные камни», История одного проекта и работа над ошибками, Основы клиент-серверной разработки, Резюме.
Qt достаточно часто обновляется, что, с одной стороны, хорошо, но, с другой стороны, порой делает разработку ночным кошмаром. Происходит это потому, что новые версии не имеют совместимости со своими предшественниками, часть функционала которых в лучшем случае устаревает, в худшем — становится более недоступной. Следствие — обилие неактуальных материалов/примеров в Сети, которые невозможно использовать в версии 5.3. Вообще, к огромному сожалению, годной информации по Qt 5.3 ничтожно мало: описывая проблему в поисковике, мы попадаем в документацию (документация качественная, но одной общей теории в большинстве случаев не хватает) или примеры для версий 4.6 или 4.8, которые, как правило, бесполезны для Qt 5.3. Официальные гайды и примеры, опять-таки, в основном описывают очень тривиальные случаи, с которыми, как правило, в действительности практически не сталкиваешься. О литературе упоминать не буду, с ней дела обстоят примерно также (актуальна для старых версий). Впрочем, эти минусы отчасти компенсирует активное сообщество (официальный форум — qt-project.org/forums).
1.2. Немного «сырая» поддержка функционала Android/iOS.
Если говорить в лоб, то на текущий момент нет реализации WebView для данных платформ. Возможно, не самый страшный недостаток, но о простой работе с геокартами, например, пока стоит забыть. Вторая проблема — невозможность получить IMEI устройства (скажем, для реализации идентификации на сервере): в старых версиях для этой цели служила библиотека QtMobility, в новых версиях её нет, полноценная замена для прежней ещё не реализована. Впрочем, даже эти недостатки реально решить, однако для этого требуется «погружение» на нативный уровень для каждой платформы (например, получение IMEI на Android — habrahabr.ru/sandbox/77966/), но это, имхо, противоречит изначальной идее платформонезависимой разработки. Также отмечу присутствие некоторых незначительных багов в самой среде разработки (Qt Creator) — иногда, например, не применялись изменения в QML-файлах без перезапуска IDE.
1.3. Отслеживание ошибок.
Общаясь с другими разработчиками (Android, iOS, Web) у меня создалось впечатление, что некоторые программисты не горят желанием использовать библиотеки, где как основной язык используется C++. В действительности при разработке небольших приложений основная часть неприятных ситуаций возникала из-за специфики всё же самого Qt, нежели C++. Как правило, сообщения об ошибках не очень содержательны: выдаваемые «file not found», «undefined reference» и несколько других сообщений могут указывать на строчки кода в классе, когда проблема может заключаться, например, в отсутствии подключения модуля в *.pro-файле, неправильном вызове метода совсем в другом месте программы и так далее. Для отслеживания ошибок (чтобы не искать последние почти вслепую) очень выручают логи: функция qDebug() — в C++ коде и console.log() — в QML. Теме ошибок посвящена практически вся следующая часть публикации, к которой мы уже подошли.
Тезисно о поставленной цели: приложение, позволяющее:
— зарегистрироваться в сервисе;
— авторизоваться;
— выводить списки;
— отправлять запросы на сервер и парсить получаемые ответы.
В общем, всё предельно просто. Мне хотелось использовать знакомые по разработке в Android идиомы: разделить логику и UI, чтобы не прописывать всё в одном коде. Взглянув на UI-формы [1] в Qt, решил, что подобный «десктопный» вид для пользовательского интерфейса не подойдёт явно: даже на устройствах с большими экранами трудно попасть по некоторым элементам. Погружаться в стили UI-форм не захотел, поэтому для вёрстки и дизайна было решено использовать QML-файлы (о них подробней в следующей части).
1. Внешний вид UI-формы на Android-устройстве.
Автор: andrew_k_21_12