В этой статье рассматривается ряд наиболее важных шагов по переносу существующего Fremantle-приложения в Harmattan. Как и всегда, отзывы, комментарии и исправления приветствуются!
Установка нового SDK
SDK можно скачать по адресу http://qt.nokia.com/downloads.
Первое, что необходимо проверить, будет ли портируемое приложение компилироваться новым SDK.
Сборка приложения в Scratchbox и запуск его на устройстве или в QEMU
На следующем шаге необходимо проверить, компилируется ли приложение в Harmattan ARMEL Scratchbox. Если приложение компилируется, то можно протестировать его работу на мобильном устройстве (N950) или на эмуляторе (QEMU). Заметим, что в этом случае приложение будет выглядеть как Qt-приложение для персонального компьютера, поскольку эмулятор не содержит Harmattan-специфичных компонентов компонентов Qt. Данная возможность появится в финальной версии сборочного окружения Harmattan.
Иконки
Размер иконок в Harmattan составляет 80х80 в списке доступных приложений и 64х64 в инструменте установки и удаления программ.
Обратите внимание, что в экспериментальной версии сборочного окружения Harmattan размеры иконок устанавливаются такими же, какими они были в Maemo 5. Это будет исправлено в финальной версии SDK для Harmattan. До этого момента, чтобы получить иконки правильного размера, необходимо вручную изменить base64 encoded секцию в файле debian_harmattan/control.
Файлы .desktop
Измените строку Exec в .desktop-файле так, как показано ниже:
Exec=invoker --single-instance --type=d /opt/myapp/bin/myapp
Обратите внимание, что файлы .desktop в Harmattan расположены в /usr/share/applications, а не в /usr/share/applications/hildon.
Флаги Harmattan
QMake определяет следующие флаги в pro-файлах:
MEEGO_VERSION_MAJOR = 1 MEEGO_VERSION_MINOR = 2 MEEGO_VERSION_PATCH = 0 MEEGO_EDITION = harmattan
contains(MEEGO_VERSION_MAJOR,1): ... contains(MEEGO_EDITION,harmattan): ...
exists($$QMAKE_INCDIR_QT"/../qmsystem2/qmkeys.h"):!contains(MEEGO_EDITION,harmattan): { MEEGO_VERSION_MAJOR = 1 MEEGO_VERSION_MINOR = 2 MEEGO_VERSION_PATCH = 0 MEEGO_EDITION = harmattan DEFINES += MEEGO_EDITION_HARMATTAN }
#ifdef Q_WS_MAEMO_5
#if defined(Q_WS_MAEMO_5) || defined(MEEGO_EDITION_HARMATTAN)
Переписывание пользовательского интерфейса на QML
После запуска приложения вы обнаружите, что оно выглядит "некрасиво". Чтобы исправить это, необходимо переписать пользовательский интерфейс на QML (на данный момент это единственный способ).
Начало работы с QML
File -> New Project -> Qt Quick Project -> Harmattan Application
Обратите внимание, что по умолчанию, QML-файлы включаются в Harmattan-приложение в качестве ресурсов. Это может быть удобно, чтобы быстро начать работу. Однако, для упрощения и ускорения процесса разработки приложения может быть полезно разместить эти файлы в файловой системе.
Портирование QGV-компонентов на QML
- Изменить субклассы QGraphicsItem и QGraphicsScene так, чтобы они стали наследниками QDeclarativeView
-
В субклассах QGraphicsItem
- переопределить функцию paint() и разместить в ней код отображения элемента с помощью QPainter
-
добавить следующий вызов:
setFlag(QGraphicsItem::ItemHasNoContents, false);
- Использовать макрос Q_PROPERTY для всех объектов, к которым вы хотите получить доступ из QML
-
В main.cpp до загрузки QML-файлов зарегистрировать новый тип:
qmlRegisterType<MemoryGameBoard>("MemoryGame", 1, 0, "MemoryGameBoard");
- Для использования построенного элемента в QML необходимо импортировать модуль (имя модуля — это первый параметр в вызове qmlRegisterType выше).
Перенос базовых частей пользовательского интерфейса в QML
- http://doc.qt.nokia.com/4.7-snapshot/qdeclarativeexamples.html
- http://www.developer.nokia.com/swipe/ux/pages/building_blocks.html
- http://library.developer.nokia.com/topic/MeeGo_1.2_Harmattan_API/html/categories/Application_Frameworks.html
Подключение пользовательских виджетов в QML
class AnalogMeter : public VolumeMeter { Q_OBJECT public: AnalogMeter(QGraphicsItem* parent = 0) : QGraphicsProxyWidget(parent) { widget = new AnalogMeterWidget(0); setWidget(widget); } private: AnalogMeterWidget *widget; };
qmlRegisterType<AnalogMeter>("vumeter", 1, 0, "AnalogMeter");
import vumeter 1.0,
AnalogMeter { id: vuMeter }
Заметим, что при использовании описанного выше способа, QML-редактор будет выдавать сообщение об ошибке (неизвестные типы) при использовании операций импорта определённых модулей и виджетов, но это не будет влиять на функциональность приложения. Более подробно совместное использование C/C++ и QML изложено в следующем разделе.
Адаптеры, прокси, оболочки для существующего кода C/C++
- http://doc.qt.nokia.com/4.7-snapshot/qtbinding.html
- http://doc.qt.nokia.com/4.7-snapshot/declarative-cppextensions-qwidgets.html
- http://doc.qt.nokia.com/4.7-snapshot/qdeclarativeextensionplugin.html
- http://doc.qt.nokia.com/4.7-snapshot/declarative-cppextensions-plugins.html
- http://taschenorakel.de/michael/2011/07/14/using-c-enums-qml/
Удаление устаревшего кода
exists($$QMAKE_INCDIR_QT"/../qmsystem2/qmkeys.h"){ DEFINES += Q_WS_MAEMO_6 QT+= declarative # As we use QML anyways we do not need any forms. FORMS = }
Хранение QML в файловой системе, а не в ресурсах
OTHER_FILES += qml/main.qml \ qml/MainPage.qml INSTALLS += target ... qml target.path = /usr/bin ... qml.path = /usr/share/vumeter/qml qml.files += qml/main.qml \ qml/MainPage.qml
view.setSource(QUrl("/usr/share/vumeter/qml/main.qml"));
view.setSource(QUrl("qrc:/qml/main.qml"));
Создание пакетов для Harmattan
Перевод: Владимир Шабаршин
Редактирование: Надежда Лагутина, Илья Парамонов
Если вы заметили неточности в приведённом тексте статьи или у вас есть дополнения, пожалуйста, приводите их в комментариях к статье.