Введение
В данной статье будет дано введение в разработку приложений для платформы MeeGo. Начиная с самых азов, установки и настройки вспомогательного программного обеспечения, и заканчивая отладкой и развертыванием приложения. Мы создадим простое приложение, выполняющее основные операции над числами (калькулятор), данное приложенное довольно простое и имеет множество способов реализации, а мы рассмотрим пример нестандартного решения представленный в книге [7].
MeeGo
MeeGo — открытая платформа, анонсирована корпорациями Intel и Nokia на мобильном конгрессе в Барселоне, которая станет гибридом мобильных систем Moblin (Mobile Linux) и Maemo. Первая версия (1.0) MeeGo появилась 26 мая 2010 года, а устройства на базе ОС — появятся до конца 2010 года.
MeeGo предназначена для работы на широком спектре устройств, включая смартфоны, планшеты и нетбуки. Это позволит создавать приложения, которые без адаптации будут работать сразу на нескольких видах устройств. Магазином приложений для MeeGo станет принадлежащий Nokia Ovi Store.
MeeGo — независимая операционная система, которая, однако, использует наработки таких проектов, как Maemo, Moblin, Fedora и Debian.
Система MeeGo является полностью открытой, её исходные коды опубликованы. Intel и Nokia заявили, что все компании-производители аппаратного обеспечения получат равный доступ к MeeGo.
MeeGo будет сосуществовать с платформой Symbian, которая сейчас используется для смартфонов. Новая ОС, возможно, будет устанавливаться в лидирующие модели мобильных телефонов. В частности, она может быть установлена на смартфон Nokia N900.
Начинаем программировать под MeeGo
Первым шагом при знакомстве с данной платформой и особенно разработкой для нее необходимо установить вспомогательное программное обеспечение, а именно Qt 4.7 SDK, Qt Creator, MeeGo Touch Framework (MTF).
Установка MeeGo Touch 1.0 вручную на Ubuntu 10.04
- Для MeeGo Touch необходим Qt версии 4.7, если все ещё не установлен, устанавливаем (скачать: qt.nokia.com/downloads).
— Прописать переменные среды:
$ export QTDIR=/[path to installed qtsdk]/qt/
$ export PATH=${QTDIR}/bin:${PATH} - Скачать и установить Touch Theme (для запуска приложений на настольной машине).
— Клонируем из хранилища: $ git clone git://gitorious.org/meegotouch/meegotouch-theme.git
— Собираем: $ qmake
— Устанавливаем: $ sudo make install - Установить необходимые пакеты: $ sudo apt-get install build-essential libgl1-mesa-dev libglu1-mesa-dev libxdamage-dev
- Скачать и установить MeeGo Touch:
— Клонируем из хранилища: $ git clone git://gitorious.org/meegotouch/libmeegotouch.git
— Конфигурируем, собираем и устанавливаем: $ ./configure && make && sudo make install
Возможные проблемы
При сборке возникли ошибки в следующих местах:
../libmeegotouch/src/corelib/scene/msceneeventeater.cpp
39: setFlag(QGraphicsItem::ItemStopsClickFocusPropagation);
../libmeegotouch/src/corelib/widgets/mscenewindow.cpp
105: setFlag(QGraphicsItem::ItemStopsClickFocusPropagation);
121 : setFlag(QGraphicsItem::ItemStopsClickFocusPropagation);
../libmeegotouch/src/views/mlabelview_simplce.cpp
244: staticText.setTextOption(viewPrivate->textOptions);
370: staticText2.setTextOption(staticText.textOption());
Первая ошибка заключалось, в том, что свойство ItemStopsClickFocusPropagation не является членом класса QGraphicsItem и вторая похожая ошибка. Я просто закомментировал эти строки на время.
Процесс работы над расширением функционала и отлавливание ошибок не останавливается не на минуту, и соответственно в следующих версиях MTF все ошибки будут исправлены и добавлены новые.
Установка MeeGo Touch 1.1 из репозитория Ubuntu 10.04
- Настраиваем менеджер пакетов:
— Добавить следующую строчку в /etc/apt/sources.list.d/meego-sdk.list
deb repo.meego.com/MeeGo/sdk/host/repos/ubuntu/10.04/ /
— Добавить ключ репозитория:
$ gpg --keyserver pgpkeys.mit.edu --recv 0BC7BEC479FC1F8A
$ gpg --export --armor 0BC7BEC479FC1F8A | sudo apt-key add -
— Обновить базу данных менеджера пакетов:
$ sudo apt-get update
— Чтобы проверить, что MeeGo репозиторий был корректно добавлен, запустите следующую команду. Будут выведены детали от пакете MADDE.
$ apt-cache policy madde - Установить MeeGo SDK: $ sudo apt-get install meego-sdk
- Установить MeeGo объект:
— Создать MeeGo обьект, используя MADDE (обьекты: ARM (N900): meego-core-armv7l-1.1; Aava: meego-handset-ia32-1.1, meego-netbook-ia32-1.1):
$ sudo mad-admin create -f «target»
— Чтобы проверить, что объекты были установлен корректно, выполните следующие команды:
$ mad -t «target» pscreate -t qt-simple qthello
$ cd qthello
$ mad -t «target» qmake
$ mad -t «target» make - Проверяем, что приложение qt-simple создан для правильного объекта, выполним: $ file build/qthello
За более подробной информацией по установке MeeGo Touch 1.1 обращаемся к ресурсу [1].
Запуск Meego-Handset [Netbook] edition на эмуляторе Xephyr
- Скачать образ Meego handset edition или netbook edition и разархивируем его:
$ wget download3.meego.com/meego-handset-sdk-20101012-1.1.80.20101024.1603-sda.raw.tar.bz2
или
$ wget download3.meego.com/meego-netbook-sdk-20101012-1.1.80.20101024.1603-sda.raw.tar.bz2
$ tar xjvf download3.meego.com/meego-handset-sdk-20101012-1.1.80.20101024.1603-sda.raw.tar.bz2
Примечание: MeeGo сборки появляются ежедневно, их можно скачать по ссылке [5]. - Скачать meego-sdk-chroot скрипт:
$ wget download3.meego.com/meego-sdk-chroot
Сделать скрипт исполняемым: $ chmod +x ./meego-sdk-chroot - Настроить Х для запуска Xephyr:
$ xhost +SI:localuser:«user name» - Смонтировать образ MeeGo в директорию и запустить meego-sdk-chroot скрипт:
$ sudo mkdir ../[name_of_mount_directory]
$ sudo mount -o loop,offset=512 ./[meego_handset_raw]
../[name_of_mount_directory]
$ sudo ./meego-sdk-chroot ../[name_of_mount_directory]
Теперь мы находимся в оболочке meego chroot.
Замечание: Для отмонтирования образа используем команду
$ sudo umount ../[name_of_mount_directory] - Запускаем MeeGo:
$ export DISPLAY=:0; устанавливаем переменную среды
$ zypper install meego-simulator-launcher-handset; только для meego-handset
$ startmeego &
При выполнении последней команды произойдет запуск оболочки MeeGo-Handset. Исходя от смонтированного образа (Handset или Netbook) у вас запуститься тот или иной образ.
MeeGo Handset на Xephyr
Рис. 1. MeeGo-Handset UI
MeeGo Netbook на Xephyr
Рис. 2. MeeGo-Netbook UI
Давайте запустим наш калькулятор для платформы Maemo на MeeGo-Handset и MeeGo-Netbook (исходник ниже по ссылке).
Запуск калькулятора на MeeGo-Netbook
- Запускаем MeeGo-Netbook на эмуляторе, как было показано выше.
- Монтируем директорию с проектом, для этого проделаем следующие шаги:
— Создаем директорию в MeeGo-Handset:
$ sudo mkdir [meego_netbook_mount_dir]/home/meego/code
— Монтируем директорию с исходниками калькулятора:
$ sudo mount --bind [calculator_sources]/ [meego_netbook_mount_dir]/home/meego/code
Примечание: Выполняем данную команду в стандартной командной оболочке (bash). - Заходим в примонтированную директорию и запускаем калькулятор:
$ cd home/meego/code/calculator
$ DISPLAY=:2 ./calculator
Примечание: Выполняем данную команду в командной оболочке meego (meego chroot)
Запушенный калькулятор на MeeGo-Netbook показан на Рис. 3.
Теперь давайте запустим калькулятор на MeeGo-Handset. Для запуска приложения необходимо проделать все те же самые шаги, что и для MeeGo-Netbook, но только запустить сборку MeeGo-Handset. Запушенный калькулятор на MeeGo-Handset показан на Рис. 4.
Рис. 4. MeeGo-Handset калькулятор
Как видно на Рис. 4, калькулятор выглядит не совсем, так как мы ожидали. Давайте разберемся, в чем же проблема. А проблема в то, что для MeeGo-Handset приложения разрабатываются с помощью специального набора инструментов, а именно MeeGo Touch Framework (MTF, libmeegotouch). Давайте посмотрим, как это делается.
Изменение приложения для MeeGo-Handset
MeeGo Touch (libmeegotouch) это инструмент разработки приложений для мобильных устройств с сенсорными экранами, основанный на Qt. Он входит в состав MeeGo Platform API. Предоставляет все необходимые строительные блоки для создания собственных приложений, которые следуют MeeGo Handset UX принципам. Инструмент построен на основе Qt Graphics View Framework.
В Qt Creator создаем проект “Empty Project”, добавляем файлы main.cpp, calculator.cpp и calculator.h калькулятора. В файле проекта необходимо указать следующие строки для установленного MeeGo Touch (MTF 1.0):
CONFIG += meegotouch
INCLUDEPATH += /usr/local/include/meegotouch
LIBS += /usr/local/lib/libmeegotouchcore.so
/usr/local/lib/libmeegotouchsettings.so
/usr/local/lib/libmeegotouchviews.so
/usr/local/lib/libmeegotouchextensions.so
После этого мы можем приступать к изменению программы для использования его на MeeGo.
Изменения, связанные с MTF
main.cpp
#include <MApplication>
#include <MApplicationWindow>
#include <MApplicationPage>
#include "calculator.h"
int main(int argc, char **argv)
{
MApplication app(argc,argv);
MApplicationWindow window;
MApplicationPage page;
Calculator *calc = new Calculator();
page.setTitle("Calculator");
page.setCentralWidget(calc);
page.appear(&window);
window.show();
return app.exec();
}
Давайте посмотрим на изменения, которые затронули main.cpp:
- Все заголовочные файлы начинаются с заглавное буквы “М”.
- Так как MeeGo Touch основан на Qt в нем могут применяться основные системные классы и функции, главные изменения затронули графическую составляющую инструмента, а именно виджеты, окна и т.д.
- MApplication имеет схожее применение, что и в Qt.
- MApplicationWindow обеспечивает основу для построения пользовательского интерфейса, предоставляет навигационную панель общую для всех приложений, которая включает в себя домашнюю кнопку и кнопку закрытия, панель инструментов (в альбомной ориентации), а также меню приложения. Т.е данный класс отвечает за то, что связанно с главным окном приложения, которое содержит все остальные элементы.
- MApplicationPage также является инструментом для построения пользовательского интерфейса приложения. По умолчанию страница создает для горизонтально просмотра, где пользователь может размещать свои компоненты с помощью методов centralWidget() или setCentralWidget(MWidget *) (в MTF 1.0, setCentralWidget(QGraphicsWidget *)). Страницы отображаются на экране с помощью метода appear(QGraphicsScene*, DeletionPolicy) или appear(MWindow *, DeletionPolicy). Вызов метода appear() запускает показ анимации связанной со страницей. Если вы хотите показать страницу мгновенно, обратитесь к MSceneManager API.
За подробностями обращайтесь к документации по Platfrom API [4].
calculator.h
#include <QStack>
#include <MGridLayoutPolicy> // класс, отвечающий за сеточную компоновку
#include <MButton> // класс кнопки
#include <MLayout> // главный класс компоновки
#include <MTextEdit> // класс текстового поля
#include <QGraphicsWidget> // главный класс для всех виджетов сцены (поверхности)
class Calculator : public QGraphicsWidget
{
Q_OBJECT
public:
Calculator(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
MButton* createButton(const QString& str);
…
private:
MTextEdit *lcdDisplay;
QStack<QString> stack;
QString strDisplay;
…
};
Чтобы добавить виджет Calculator на страницу приложения с помощью метода setCentralWidget() его необходимо унаследовать от класса QGraphicsWidget. В MTF 1.1 функция установки центрального виджета страницы setCentralWidget() принимает в качестве устанавливаемого компонента MWidget.
calculator.cpp
#include "calculator.h"
Calculator::Calculator(QGraphicsItem *parent, Qt::WindowFlags wFlags) :
QGraphicsWidget(parent, wFlags)
{
lcdDisplay = new MTextEdit();
lcdDisplay->setReadOnly(true);
lcdDisplay->setMinimumSize(150, 50);
…
MLayout *layout = new MLayout;
MGridLayoutPolicy *ptopLayout = new MGridLayoutPolicy(layout);
ptopLayout->addItem(lcdDisplay, 0, 0, 1, 4);
ptopLayout->addItem(createButton("CE"), 1, 3);
for (int i = 0; i < 4; ++i)
for (int j = 0; j < 4; ++j)
ptopLayout->addItem(createButton(aButtons[i][j]), i + 2, j);
layout->setPolicy(ptopLayout);
setLayout(layout);
}
Это в основном главные изменения, которые коснулись приложения при переносе на MeeGo-Handset. Есть некоторые изменения связанные с отображением результата вычислений с помощью QLCDNumber, т.к данного класса в MTF 1.0 не оказалось, пришлось его заменить на MTextEdit.
Результат изменений представлен на Рис. 5.
Рис. 5. MeeGo-Handset калькулятор
Как видно из представленных изменений, перенос приложения для MeeGo-Handset не составляет особого труда. Со временем MTF будет только набирать функциональность и мощь, что даст разработчикам более широкий простор для маневра и более современных и качественных приложений.
Заключение
MeeGo является совместной разработкой компаний Nokia и Intel, которая только начинает набирать обороты и завоевывать рынок. Данная платформа основана на Maemo и Moblin, и вобрала в себя все преимущества этих платформ и приобрела собственные.
Платформа развивается и будет широко использоваться в ближайшем будущем. Основной акцент смешается к платформе MeeGo, которая может использоваться на многом количестве устройств, начиная мобильными устройствами и заканчивая телевизорами.
Список литературы
- Установка и настройка MeeGo SDK: wiki.meego.com/SDK/Docs/1.1/Getting_started_with_the_MeeGo_SDK_for_Linux.
- Запуск MeeGo на эмуляторе Xephyr: wiki.meego.com/MeeGo_SDK_with_Xephyr
- Platform API: apidocs.meego.com/1.1/platform/html/index.html
- MeeGo API 1.1: apidocs.meego.com/1.1/core/html/index.html
- Сборки MeeGo: repo.meego.com/MeeGo/builds/
- Шлее М. – Qt 4.5. Профессиональное программирование на С++. – СПБ.: БХВ-Петербург, 2010г., 896с.
- Hello World for MeeGo-Handset: wiki.meego.com/SDK/Docs/1.1/Creating_Hello_World, blog.telaic.pl/?p=63
- Обзор MeeGo: ru.wikipedia.org/wiki/MeeGo
P.S
Автор: h05t