Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Свежие ощущения о BlackBerry 10 NDK

Anna | 24.06.2014 | нет комментариев

Последние две недели я вновь копался в BlackBerry 10 NDK, так как один из моих заказчиков попросил подмогнуть ему. Я предложил адаптировать свой курс «вступление в Qt» под платформу BlackBerry, а также порекомендовал следовать советам из моей серии учебных роликов про BB10 и Cascades, опубликованных в начале этого года на YouTube. Сейчас мне хочется поделиться с вами моими свежими ощущениями о BlackBerry 10 NDK. Кстати, я теснее писал о моих первых экспериментах с BB10 NDK этой весной.

Внимание. Это свободный перевод заметки Йэнса Веллера. Перевод сделан для составления всеобщей картины о нынешнем состоянии мира [BB10 Qt]. Славного чтения.

Приложения и C

Перед тем как начать, малое вступление о приложениях и C . Люди, переходящие с других языков, как бы Java либо .NET, Зачастую не понимают необходимости написания приложений именно на C . Исключительно переходящие с языков, принудительно завязанных на ООП и Сборщик Мусора — им сложно осознать все концепты, используемые в C . По-моему, на самом деле, есть много причин применять C для разработки приложений, исключительно в связке с таким сильным фреймворком Qt. Одна из причин — эффективность, так как C подлинно ближе к железу, ваше приложение будет есть минимум батареи. Не говоря теснее о том, что имеется потолок роста продуктивности устройств в грядущем, об этом упоминал Герб Саттер в своей заметке «бесплатные пайки закончились» (есть перевод на прогре от webmascon — прим. переводчика). Qt Framework сейчас доступен и для Android и для iOS, так что C и Qt/QML стали подлинно сильной комбинацией для создания мобильных приложений.

NDK и Cascades

Следственно, когда вы разрабатываете приложения под BlackBerry 10, вам нужно начинать именно с BlackBerry NDK. У меня не было довольно времени поиграть со свежевышедшей 1.2 версией, но IDE на 1-й взор стала приметно отменнее и стабильнее. Но 1.2 пока не получила «золотой» ранг (фиксация API — прим. переводчика), следственно я рекомендую писать под 1.1, разве что вам что-нибудь необходимо из 1.2. BlackBerry NDK поставляется совместно с Cascades Framework, API которого вы будете применять при разработки приложения под BB10. Cascades сделан поверх Qt и использует QML, в то время как у Qt5 есть QtQuick 2, потому что у BlackBerry своя реализация QML, работающая в UI-потоке. Так что QML, сделанный под QtQuick1 либо 2 не будет трудиться под Cascades. А ещё Qt5 не всецело поддерживается Cascades — нынешняя версия основана на Qt 4.8.

С 2010 года я интересуюсь мобильной разработкой на Qt и QML, прежде был занят MeeGo, а теперь я с BlackBerry. QML в BB10 немножко отличается, в нём применяются особые элементы, скажем: Container, Pages и Controls, в то время как в QtQuick1/2 предлагает вовсе базовые элементы как бы Item либо Rectangle. Так что для QML и его API у BlackBerry имеется свой небольшой мирок. Тем временем Qt5-приложения дозволено собрать и запустить на BB10, правда это не будет сопровождаться той степенью интеграции, которую предлагает Cascades.

QML и C

Судя по документации и обсуждениям, стержневой подход сводится к применению QML для большинства задач и мостов в C только при необходимости. Скажем, при написании моделей в C и дкларирования способов класса с поддержкой Q_PROPERTY для доступа их QML. После этого б
Данный легкой элемент для отображения в контейнере ListView, через ListItemData мы получаем доступ к данным для отображения. Я здесь внёс небольшую ошибку, на самом деле элемент именуется title, а titel— это по-немецки. Тем больше, немец это не сразу подметит. А QML не подметит тем больше. Вы можете вставить всякое слово тут, QML не проверяет такого рода ошибки не во время компиляции, ни во время исполнения. Ничего не будет отображено, допустимо вам повезёт найти предупреждение в консоли. Кстати, если верно настроить IDE, то сообщение верно должно возникать, даже при отладке на устройстве.

Как с этим бороться? За Cascades скрывается C фреймворк, построенный на Qt, так что правда бы в C у нас есть шанс найти это и запротоколировать ошибку. К сожалению, это немыслимо найти во время компиляции, но я тружусь в этом направлении. Так что Q_ASSERT делает проверку во время работы приложени. Для всех элементов из Cascades, задействованных в QML, имеется класс в C , инстанциирующийся динамически для всякого элемента во время исполнения приложения. Cascades API разрешает искать объекты этих классов и предоставляет метод контроллировать некоторые вещи. Для ListView также имеется класс, поставляющий элементы для ListView из C : ListItemProvider. У этого классе есть свой интерфейс:

virtual bb::cascades::VisualNode* createItem(bb::cascades::ListView* listview,const QString& type);
virtual void updateItem(bb::cascades::ListView* listview,bb::cascades::VisualNode* node,const QString& type,const QVariantList& indexPath, const QVariant& data);

Своя реализация этих виртуальных способов разрешает создавать элементы для отображения в ListView и также заполнять их востребованными значениями. BlackBerry предоставляет примеры реализации. К сожалению, эти примеры не испольуют QML, а написаны целиком на C . Но мне лично нравится применять QML для UI. А ещё такой ООП-жанр, как в примере от BlackBerry, подразумевает наследование отListItemProvider для всякого отдельно взятого ListView, а мне хотелось бы решить данную задачу раз и навечно, так что у меня свой обобщённый ListItemProvider. Так как все проверки происходят во время работы приложения, образцы C — не вариант, давайте взглянем на следующую реализацию. Перед тем как я перейду к crateItem, короткая отсановка на addType, вспомогательном способе для декларирования обработчиков для всякого типа:

void ListViewItemProvider::addType(const QString& type, const QString& qmlasset, const listitem_callback& callback)
{
    bb::cascades::QmlDocument* doc = bb::cascades::QmlDocument::create(qmlasset);
    if(!doc->hasErrors())
    {
        doc->setParent(this);
        type_map.insert(type,doc);
        callback_map.insert(type,callback);
    }//TODO add additional error checking & handling
}

Данный способ добавляет разные обработчики для разных типов. Типы описываются в QML с поддержкой объектов QString, так что QMap<QString, QmlDocument*> будет довольно для хранения поддерживаемых типов. Данный способ преобразует qml-источник (скажем, file:///partial.qml — прим. переводчика) вQmlDocument с поддержкой QmlDocument::create. Между прочим, QmlDocument::create на самом деле не возвращает QmlDocument*, как написано в примере выше. Он возвращает ссылку на рабочий класс Builderдля создания QmlDocument‘ов, после этого, схоже, изготавливает неявное реформирование в QmlDocument*. В тезисе, тут ничего увлекательного, идём дальше, способ createItem:

bb::cascades::VisualNode* ListViewItemProvider::createItem(bb::cascades::ListView* listview,const QString& type)
{
     if(type_map.find(type)!=type_map.end())
     {
          bb::cascades::Container* node = type_map[type]->createRootObject<bb::cascades::Container>();
          return node;
     }
     Q_ASSERT_X(false,__FUNCTION__,type  " TYPE not handled");
     bb::cascades::Container* con = new bb::cascades::Container(0);
     bb::cascades::Label* label = new bb::cascades::Label(con);
     label->setText("ERROR");
     return con;
}

Данный код вначале проверяет регистрацию типа, а после этого создаёт объект через способQmlDocument::createRootObject, тот, что возвращает указатель на сделанный объект. Это образец, так что мы обязаны предварительно знать тип объекта для создания. Пока я для себя определился, что для всех UI элементов я буду применять Container в качестве корневого объекта. Возможнняет это неувязка и делает Qt-модели пригодными для применения в Cascades.

IDE

Сейчас, пару слов об IDE. Как я теснее сказал ранее, IDE улучшилась с выходом версии 1.2. Среда улучшается, но в некоторых случаях всё равно остаётся далёкой от совершентсва. Редактор QML по-прежднему не довольно отменен, но сейчас при падении не роняет всю IDE. Альтернативой мог бы стать Qt Creator, в нём помощь QML также улучшилась. На данный момент, мне кажется Momentics IDE (основывается на Eсlipse — прим. переводчика) от BlackBerry отменнее, чем QtCreator, если речь о разработке под Cascades. Во-первых, в QtCreator нет интеграции с Cascades вообще, следственно автодополнение QML трудиться не будет, потому как в NDK отсуствтует нужный для этого файл. По этой же причине не будет трудиться визуальный редактор QML. Qt, безусловно, чуть отменнее поддерживается в QtCreator, но в 1.2 версии NDK подлинно много совершенствований в этом направлении. Образцы планов, предлагаемые QtCreator, не такие отличные, как в Momentics, скажем, в них отсутствует интеграция кода локализации. Мне нравится то, что образцы в Momentics включают QTranslator в main.cpp. Momentics и QtCreator обма могут сделать рабочее приложение под моё DevAlpha устройство, так что разработка под BB10 в QtCreator допустима, но есть куда расти.

Я загрузил начальные коды ListViewItemProvider, если вам нужно…

Знаменитые комментарии (1 шт)

— Кто хочет навестить морг?

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB