- Qt Documentation
- Qt for Android
- Qt Documentation
- Contents
- Running the Examples
- Essentials
- Qt Quick and QML Examples for Android
- QML — Урок 026. Intents с Qt для Android, часть 1
- Радость и грусть разработки на Qt под Android (и не только)
- Проблема №1
- Проблема №2
- Проблема №3
- Проблема №4
- Проблема №5
- Бонус №1
- Бонус №2
- Бонус №3
- Резюме
Qt Documentation
Qt for Android
Qt for Android enables you to run Qt 5 applications on Android devices. All Qt modules (essentials and add-ons) are supported except the following:
- Qt WebEngine
- Qt Serial Port
- Qt Virtual Keyboard
- Platform-specific extras: Qt Mac Extras, Qt Windows Extras, and Qt X11 Extras
The following configurations are supported:
Platform Version | Architecture | Compiler | Build Environment |
---|---|---|---|
Android 5.0 or later (that is, API Level 21 and up) | armv7a and x86 , arm64-v8 and x86_64 | Clang as provided by Google, MinGW 8.1 | RHEL 7.x (x86_64), macOS 10.15, Windows 10 (x86_64) |
The following list summarizes what you can do with Qt for Android:
- Run Widget-based and QML applications on a device or an emulator.
- Support for the Material Style with Qt Quick Controls.
- Handle Multimedia content in your Qt Quick 2 applications.
- Get sensor readings.
- Retrieve positioning data using satellite or network information.
- Connect and exchange data with Bluetooth and NFC-enabled devices.
- Integrate Java code into your application using Qt Android Extras.
- Develop secure applications using OpenSSL library.
- Create Android Services.
- Create and deploy Application Package (APK) and Android App Bundle (AAB) packages using Qt Creator.
The following topics provide more details about how to use Qt for Android:
В© 2021 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.
Источник
Qt Documentation
Contents
This page lists Qt examples that have been tested to run on Android. However, most Qt Examples can be run on Android even though they are not listed here.
Running the Examples
To run examples from Qt Creator, select Welcome > Examples, and then select an installed Qt for Android to filter the examples that have been tested to run on Android. For more information, see Building and Running an Example.
Essentials
The following sections describe how to get started with developing applications for Android:
Qt Android Extras is an Android specific module used to integrate Qt API with Java API by enabling communication between Qt code (C++ and QML) and Java code. The following examples demonstrate some of the features of the module:
- Qt Notifier demonstrates how to call Java code from an Android application.
- Qt JNI Messenger demonstrates communication between Java code and QML or C++ using JNI calls.
- Android Custom Activity demonstrates working with custom Android activities.
- Qt JNI Music List demonstrates how to exchange data from complex Java objects.
- Android Service with Qt Remote Objects demonstrates how to run an Android service, and how to communicate between the service and the app using Qt Remote Objects.
For the full list examples, see Qt Android Extras Examples.
Qt Quick and QML Examples for Android
The following Qt Quick and QML examples are useful when developing applications for Android. For a full list of Qt Quick examples including beginner-level tutorials, see Qt Quick Examples and Tutorials.
Источник
QML — Урок 026. Intents с Qt для Android, часть 1
«Intent» является главной возможностью для межпроцессорного взаимодействия в Android. В основном, Intent является объектом, который обрабатывается операционной системой и передаётся затем одному или большему количеству установленных приложений, основываясь на его содержании. Это может быть экземпляр запроса отображения видео, в данном случае тип intent должен быть ACTION_VIEW и mime тип должен быть установлен соответствующий. Приложения могут подписываться на соответствующие Intents в настройках фильтра intent в своих манифест файлах. В первый раз пользователю устройства будет предоставлен выбор, какие типы intent известны приложению и на какие можно подписаться. Если они выбраны, они будут установлены по умолчанию, или выбраны при вопросе от каждого экземпляра приложения при необходимости.
Это первая из нескольких статей, как использовать intents с Qt для Android.
Сам механизм имеет довольно общий характер. То, что описано выше является одним из способов использования, но intents также могут быть использованы и для другого: Одним из таких случаев является запуск сервисов внутри приложения. Это, как правило, называется «explicit intent», что означает, что предусмотрено для запуска полное имя сервиса, и не может быть перехвачено другим приложением.
Другим способом использования intents является широковещательный вариант (broadcast), для экземпляров, когда изменяется временная зона устройства. В это время как действия описанные выше позволяют запускать только одно определённое приложение, выбранное пользователем, то при широковещательном вариант сигнал будет передан во все приложения, которые были на него подписаны.
Данный вариант нацелен на Android устройства, но похожий механизм, называемый app extensions , был введён в iOS 8.
В этой первой статье об intents на Android сфокусируемся на простейшем варианте использования: Создание скрытого intent из Qt для запуска неопределённого приложения на целевом устройстве. Например, сделано простой приложение, которое представляет рецепты еды. Каждый рецепт имеет время приготовления. По клику по кнопке, вы можете установить таймер, используя обратный отсчёт на устройстве. (Для более полезного применения можно представить кнопку установки времени для каждого шага приготовления рецепта, но в этом простом примере будем использовать только один таймер.)
Не будем вдаваться в подробности того, как приложение было написано, но кому интересно, то код может быть найден здесь . Никаких усилий по улучшению внешнего вида приложения приложено не было, поэтому не обращайте на это внимания. Приложение основывается на базе данных SQLite (которая заполнена некоторым фейковым контентом при первом запуске) и имеет очень простой пользовательский интерфейс, написанный на Qt Quick Controls 2, который позволяет пользователю выбрать рецепт из списка, посмотреть его описание на отдельной странице и нажать кнопку в рецепте для установки таймера в систему.
А теперь сфокусируемся на коде, который фактически запрашивает таймер от системы. Это находится в файле recipe.cpp , функции Recipe::createTimer() . В нашем примере мы используем следующий тип intent — AlarmClock.ACTION_SET_TIMER .
Мы будем использовать для этого удобный JNI API из модуля Qt Android Extras . Давайте пройдём по коду шаг за шагом.
Первым шагом создадим intent. Мы принимаем идентификатор ACTION_SET_TIMER intent. Он является статическим участником в android.provider.AlarmClock классе и имеет строковый тип данных (String). Заметьте, что использование слэшей вместо точек в имени пакета класса. Это соотносится с представление имён пакетов в байткоде (так сложилось по историческим причинам, смотрите спецификацию ) и следовательно также используется в подписи JNI.
Так как мы используем только функции из Qt Android Extras и не используем явные вызовы к JNI API, то мы можем не беспокоиться об эталонном управлении. Это главное удобство данного API.
Следующим шагом мы создадим intent объект. Мы сделаем это построив QAndroidJniObject и передав его в в JNI-разборщик подписей Java конструктора, который желаем вызвать, а также передадим ID действия, которое хотим получили из класса AlarmClock.
Следующим шагом, мы установим несколько аргументов, которые мы хотим послать в обработчик действия Activity. Мы передаём в описании таймер и количество секунд для установки.
Затем мы разрешаем данную activity. Она скажет системе проверить, доступно ли приложение для обработки действия ACTION_SET_TIMER. И тогда мы сначала получим текущую activity (в нашем текущем контексте) для того, чтобы получить соответствующий пакетный менеджер. Затем вызовем resolveActivity() на intent для передачи его в пакетный менеджер.
Если возвращённое имя компонента является ненулевым, то мы запускаем activity используя удобную функцию в Qt Android Extras. Если соответствующей activity не было найдено, тогда сделаем вывод об ошибке в консоль. Правильное приложение должно сообщать об ошибке в пользовательском интерфейсе, но заметьте, что операционная система также сообщит пользователю о проблемах в этом месте.
Источник
Радость и грусть разработки на Qt под Android (и не только)
Qt я использую достаточно давно, начиная с версии 4.1. Не сказать, что я «профессионально» его использую, но опыт был разный — и работы с виджетами и эволюции до версии 5.6.
Некоторые примеры проектов:
- Пульт управления караоке-центром (Android/iOS)
- Русско-Татарский словарь с кастомной клавиатурой (Android/iOS/WP), тогда ещё даже API для iOS кастомных клавиатур не было
- Cоциальная сеть с разными примбамбахами под Android (гео, блютуз, чаты, фотки, профили и т.д.)
- Приложение для быстрого заказа цветов (Android/iOS/WP)
Кроме того, на Qt написано Android приложение 2gis, на котором вы и можете проверить большинство описанного здесь.
Заранее прошу меня поправить, если что-то из описанного здесь имеет ненайденные мною пути решения (буду благодарен, если вы их укажете). Всё нижесказанное относится по большей части к Android.
Проблема №1
Первое и самое главное на сегодняшний момент: если вам нужно много работать с текстом, вводимым пользователем — не выбирайте Qt/Qml!
Крайне не люблю восклицательные знаки, но тут этот знак на своём месте: вам будет крайне сложно реализовать привычное для пользователей целевой платформы работы с полями ввода, а именно:
- Выделение текста
- Copy & Paste
Суть проблемы: баг работы с элементом редактирования текста висит аж с 2014 года, отмечен как Important и зарегистрирован пользователем с Silver подпиской, но до сих пор не исправлен. В багтрекере описан обходной путь, но если вы хотите использовать не Quick.Controls а чистый Quick с TextEdit и TextInput — извините.
Возможно кто-то скажет, что я слишком многого хочу и TextEdit/TextInput это базовые компоненты, но, извините меня, отсутствие Copy & Paste в базовых компонентах и отсутствие его реализации в Controls не будут вам доставлять проблем до первого замечания Заказчика.
TextEdit не содержит сигналов работы с указателем, типичных для MouseArea, поэтому попытка реализовать показ контекстого меню через долгое нажатие (PressAndHold в терминах Qml) успехом не увенчается. Кроме того, попытка в лоб обернуть поле ввода в MouseArea подходит лишь для ограниченного числа сценариев, т.к. вам придётся долго и упорно реализовывать выставление курсора между буквами и словами.
Поэтому, остаётся либо лезть в исходники и кастомизировать поле ввода, либо смириться.
Проблема №2
Второе и самое любимое заказчиками приложений, содержащий социализацию: Emoji
Суть проблемы: отсутствует нативная обработка любимых всеми смайликов, что в полях ввода, что в тексте — развивайте фантазию и реализуйте сами.
Узнать, что такое на самом деле Emoji и какова нелёгкая судьба их реализации в различных ОС вам поможет статья в Википедии. По факту же, какие есть варианты:
- Использовать шрифт с поддержкой символов Emoji. Используйте FontForge для компиляции Roboto с Emoji!
- RichText с заменой символов Emoji на цветные png’шки
- Глубокая кастомизация поля ввода (можете посмотреть в исходниках телеграмма для десктопа)
Итого: либо оно выглядит некрасиво (вариант 1), либо глючит (вариант 2), либо требует отличных знаний внутренностей Qt (вариант 3 — а если они у вас есть, вам не стоит труда решить большинство проблем).
P.S. Забавная забавность — не выставляйте никаких inputMethodHints у поля ввода, иначе встроенная Android клавиатура с Emoji (iWinn IME) у вас просто не покажется.
Проблема №3
Третье и самое раздражающее: Мерцание и BlackScreen’ы — ваши лучшие друзья.
Это будет сопровождать вас при загрузке приложения, при попытке выставить windowSoftInputMode в AdjustResize, куски чёрного экрана будут тоже периодически появлятся. Поэтому тестируйте, тестируйте и ещё раз тестируйте на реальных девайсах.
Проблема №4
Четвёртое и самое трудноловимое: Шрифты
Суть проблемы: на разных девайсах каждый год всплывает одно и то же, симптомами похожее на закрытый баг. Вы не узнаете об этом, пока счастливый обладатель андроид-девайсана начнёт жаловаться на то, что шрифт плывёт, ломается, невидимый и т.д. В основном, это китайско-корейские девайсы.
Выход здесь только один — брать исходники Qt и патчить под конкретный GPU.
Проблема №5
Пятое и самое спорное: продвинутые контролы Qml — Camera и иже с ними.
Суть проблемы: частые краши, нехватка функциональности и прочие несоответствия стандартного пользовательского опыта нативных приложений. Лечится это всё очень просто — не стесняйтесь добавлять нативные компоненты (Activity в случае Android) в своё приложение. Да, от этого его кроссплатформенность снизится, а количество кода увеличится, но оно того стоит.
Бонус №1
Первое и самое важное: реальная кроссплатформенность.
Суть: после того, как ребята из SQLite портировали своё детище под WP, а скромный автор сего произведения указал на это ребятам из Qt, в порт Qt для WP был добавлен LocalStorage. Это счастье для всех любителей Qml.
Вы реально можете создавать приложения из одних исходников, реально под кучу платформ, при этом кастомизировать их в нужных местах исходя из возможностей и необходимостей платформы. Декларативный UI и js затягивают настолько сильно и позволяют писать настолько лаконичный код, что возвращаться после него на многословную Java + xml, либо спорный Swift + Storyboard’ы нет никакого желания.
Любые анимации, поддержка кастомных шрифтов, svg — это ли не счастье для мобильного разработчика?
Бонус №2
Второе и самое любимое заказчиками: нестандартность.
Суть: фраза от заказчика, приводящая к желанию убивать — «Сделайте как на айфоне». Теперь это не проблема, везде будет выглядеть примерно одинаково. Да, это нарушение гайдлайнов, да, это нехорошо и никогда так не делайте, но заказчик хочет так и у вас три пути — убедить его, уступить ему или отказаться от него, выбирайте сами.
Кроме того, при достаточном желании можно подхачить исходники платформы, так, как нужно именно вам. Так, в нескольких приложениях мы просто насовсем отключали клавиатуру и писали свою на базе Qt Virtual Keyboard, тогда как встроенные приложения таких возможностей не имели.
Бонус №3
Третье и самое любимое мной: скорость разработки.
Суть: в любом состоянии вы можете спроектировать UI практически любой сложности (исключая особенности взаимодействия с ОС, такие как поля ввода, обработка устройства ввода и т.д.). Если вы сам себе заказчик — то перед вами все дороги открыты.
Резюме
Начиная новый проект стоит прежде всего правильно для себя оценить границы развития этого проекта. Если в нём мало работы с нативными возможностями платформы и много нестандарта — используйте Qt. Если же наоборот — подумайте, сможете ли вы его доработать так, как вам нужно.
Спасибо за внимание! Поделитесь своим опытом использования Qt в разработке мобильных приложений в комментариях.
Источник