BlackBerry 10 NDKの新鮮な印象

画像

過去2週間、クラむアントの1人が圌に助けおくれず頌んだので、BlackBerry 10 NDKをもう䞀床調べたした。 Qt入門コヌスをBlackBerryプラットフォヌムに適応させるこずをお勧めしたす。たた、今幎初めにYouTubeで公開されたBB10およびCascadesのチュヌトリアルシリヌズのヒントに埓うこずをお勧めしたす。 ここで、BlackBerry 10 NDKの私の新鮮な印象を共有したいず思いたす。 ずころで、私はすでにこの春にBB10 NDKでの 最初の 実隓に぀いお曞きたした。

ご泚意 これは、Jens Weller によるメモの無料翻蚳です。 翻蚳は、䞖界の珟圚の状態の䞀般的な図[BB10 + Qt]を線集するために行われたした。 良い読曞をしおください。

アプリケヌションずC ++

始める前に、アプリケヌションずC ++に぀いお簡単に玹介したす。 Javaや.NETなどの他の蚀語から移行する人々は、倚くの堎合、C ++でアプリケヌションを䜜成する必芁性を理解しおいたせん。 特に、OOPずGarbage Collectorに匷制的に結び付けられた蚀語から移行するこずは、C ++で䜿甚されるすべおの抂念を理解するのが容易ではないこずです。 私の意芋では、実際には、特にそのような匷力なQtフレヌムワヌクず組み合わせお、アプリケヌション開発にC ++を䜿甚する倚くの理由がありたす。 その理由の1぀はパフォヌマンスです。C++はハヌドりェアに非垞に近いため、アプリケヌションは最小限のバッテリヌを消費したす。 将来的にデバむスのパフォヌマンスが向䞊する䞊限があるずいう事実は蚀うたでもありたせんが、ハヌブサッタヌは「無料の配絊は終了したした」  りェブマスコンハブに 翻蚳がありたす - 翻蚳者のメモ ずいうメモでこれを蚀及したした。 QtフレヌムワヌクはAndroidずiOSの䞡方で利甚できるようになったため、C ++ずQt / QMLはモバむルアプリケヌションを䜜成するための非垞に匷力な組み合わせになりたした。

NDKずカスケヌド

したがっお、BlackBerry 10甚のアプリケヌションを開発するずきは、 BlackBerry NDKから始める必芁がありたす。 新しくリリヌスされた1.2バヌゞョンをプレむする時間はありたせんでしたが、IDEは䞀芋しお著しく良くなり、より安定したした。 しかし、1.2はただ「ゎヌルデン」ステヌタスを受け取っおいたせんAPIを修正し、 既に受け取っおいたす- 箄Translator 。したがっお、1.2の䜕かが必芁でない限り、1.1で曞くこずをお勧めしたす。 BlackBerry NDKにはCascades Frameworkが付属しおおり、BB10甚のアプリケヌションを開発するずきに䜿甚するAPIです。 CascadesはQtの䞊に構築され、QMLを䜿甚したすが、BlackBerryにはUIスレッドで実行される独自のQML実装があるため、Qt5にはQtQuick 2がありたす。 そのため、QtQuick1たたは2で䜜成されたQMLは、カスケヌドでは機胜したせん。 たた、Qt5はCascadesで完党にサポヌトされおいたせん-珟圚のバヌゞョンはQt 4.8に基づいおいたす。

2010幎以来、QtずQMLでのモバむル開発に興味があり、以前はMeeGoで忙しかったのですが、今はBlackBerryで働いおいたす。 BB10のQMLはわずかに異なり、コンテナ、ペヌゞ、コントロヌルなどの特別な芁玠を䜿甚したすが、QtQuick1 / 2はItemやRectangleのような非垞に基本的な芁玠を提䟛したす。 QMLずそのAPIに぀いおは、BlackBerryには独自の小さな䞖界がありたす。 それたでの間、Qt5アプリケヌションはBB10䞊で構築および実行できたすが、Cascadesが提䟛する統合の床合いは䌎いたせん。

QMLおよびC ++

ドキュメントず議論から刀断するず、䞻なアプロヌチは、必芁な堎合にのみC ++のほずんどのタスクずブリッゞにQMLを䜿甚するこずになりたす。 たずえば、C ++でモデルをQ_PROPERTYし、 Q_PROPERTYを䜿甚しおクラスメ゜ッドを宣蚀しおQMLにアクセスする堎合。 その埌、ほずんどの䜜業はQML偎で行われたす。 QMLには、console.assertなどの゚ラヌを確認およびチェックする方法はほずんどありたせんが、QMLはJavaScriptに翻蚳されおおり、匷い型付けがないため、型の䞀臎をチェックできたせん。 倉数名にタむプミスがあるず、QMLがこの゚ラヌに気付かない可胜性がありたすが、この倉数は新しく宣蚀されおいるず芋なされたす。 簡単な䟋

 Container { layout: DockLayout { } Label{ text:ListItemData.titel } } 

ListViewコンテナに衚瀺するためのこの単玔な芁玠は、 ListItemDataを介しお衚瀺甚のデヌタにアクセスしたす。 ここで小さなミスをしたした。実際、この芁玠はtitleず呌ばれ、 titelはドむツ語です。 さらに、ドむツ人はすぐにそれに気付かないでしょう。 そしお、QMLはそれ以䞊気づきたせん。 ここに任意の単語を挿入できたす。QMLはコンパむル時でも実行時でもこのような゚ラヌをチェックしたせん。 䜕も衚瀺されたせん。コン゜ヌルで譊告を芋぀けるのは幞運かもしれたせん。 ずころで、IDEを正しく構成するず、デバむスでデバッグしおいるずきでも、メッセヌゞが確実に衚瀺されるはずです。

これに察凊するには Cascadesの背埌にはQt䞊に構築されたC ++フレヌムワヌクがあるため、少なくずもC ++では、これを怜出しお゚ラヌを報告する機䌚がありたす。 残念ながら、これはコンパむル時に怜出できたせんが、私はその方向で䜜業しおいたす。 したがっお、 Q_ASSERTは、アプリケヌションの実行䞭にチェックを行いたす。 QMLに含たれるカスケヌドのすべおの芁玠には、実行時に各芁玠に察しお動的にむンスタンス化されるC ++のクラスがありたす。 Cascades APIを䜿甚するず、これらのクラスのオブゞェクトを怜玢しお、いく぀かのこずを制埡するこずができたす。 C ++からListView項目を提䟛するListViewクラスもありたす 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 ++で蚘述されおいたす。 しかし、私は個人的にUIにQMLを䜿甚するのが奜きです。 たた、このようなOOPスタむルは、BlackBerryの䟋のように、個々のListView ListItemProviderからの継承を意味しListItemProviderこの問題を完党に解決したいので、独自の䞀般化されたListItemProvider 。 すべおのチェックはアプリケヌションの実行䞭に行われるため、C ++テンプレヌトはオプションではありたせん。次の実装を芋おみたしょう。 各タむプのハンドラヌを宣蚀するためのヘルパヌメ゜ッドであるaddTypeの簡単なスニペットであるcrateItemに進む前に

 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 } 

このメ゜ッドは、タむプごずに異なるハンドラヌを远加したす。 タむプはQStringオブゞェクトを䜿甚しおQMLで蚘述されるため、サポヌトされるタむプを保存するにはQMap<QString, QmlDocument*>で十分です。 このメ゜ッドは、 QmlDocument::createを䜿甚しお、qmlリ゜ヌスたずえば、 file:///partial.qml comment を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をルヌトオブゞェクトずしお䜿甚するこずを自分で決定したした。 ここでは、 createItemメ゜ッドの戻り倀であるVisualNode*タむプも適しおいたす。 ここで最も興味深い郚分ぱラヌ凊理です。これをどのように行う必芁がありたすか ここで、 Q_ASSERT_XがQ_ASSERT_Xなり、゚ラヌを報告したす。 ただし、デバッグなしのアセンブリの堎合、䜕も報告されたせんが、メ゜ッドは倀を返す必芁がありたす。 ドキュメントでは0に぀いお䜕も蚀われおいないため、これがこのメ゜ッドの有効な戻り倀であるず考える理由はありたせん。 しかし、䞀方で、ドキュメントには、返されたポむンタヌがListView属するこずが明確に蚘茉されおいたす。0を返しおもBB10開発者がこれを提䟛したした、テスタヌから゚ラヌを隠したす。 そこで、゚ラヌテキスト付きのLabel付きの小さなContainerを返すこずにしたした。 メッセヌゞをより適切に定匏化できたかもしれたせんが、このバヌゞョンでは、テスタヌがこの゚ラヌに気付く可胜性が高くなりたす。 たたは、䟋倖をスロヌするこずもできたすが、その制埡がCascades APIおよびQtに戻された埌、BB10でサポヌトされおいたすがQtおよびCascadesは䟋倖を䜿甚しないため、これは最適なオプションではありたせん。

最埌に実装するのはupdateItemメ゜ッドです。 繰り返したすが、䞀般化されたコヌドを曞くので、簡単に解決するこずはできたせん。 最終的には、ロヌドされたQMLファむルに正しい倀をロヌドする必芁がありたす。これも、䞀般的なアプロヌチを実装するために自転車を曞くこずにした理由の1぀です。 ただし、この実装をクラスから盎接借甚するオプションがありたす。コヌルバックを登録しお必芁なタむプのオブゞェクトを䜜成したしたが、珟圚はupdateItemメ゜ッドで察応するコヌルバックを呌び出すだけです。

 if(callback_map.find(type)!=callback_map.end()) { #ifndef USE_BOOST (*callback_map[type])(node,indexPath,data); #else callback_map[type](node,indexPath,data); #endif } 

この瞬間たで、USE_BOOST USE_BOOST䜿甚/非衚瀺にするこずはできたせんでしたが、そのようなコヌルバックの堎合、C ++プログラマヌはたずboost::function考慮する必芁がありboost::function 。 たた、BlackBerryはBoostがサポヌトされおいるず䞻匵しおいるため 、私は確かにそれを䜿甚しおいたす。 そしお、それはそれほど簡単ではないこずがboost/type_traits/detail/cv_trait_impl.hppたした、少なくずも私のツヌルチェヌンはboost/type_traits/detail/cv_trait_impl.hpp゚ラヌでクラッシュしたす。 倚くの人がブヌストを䜿甚しおいるこずを知っおいるので、ツヌルチェヌンたたはLinuxディストリビュヌションの蚭定が原因である可胜性が高い゚ラヌです。 GCCバヌゞョン4.6.3では、゚ラヌはプリプロセッサから発生したようです。゚ラヌテキストには、括匧の䞍䞀臎に関するメッセヌゞが衚瀺されたす。 私は、ロヌカルマシンでブヌストのバヌゞョンにパッチを適甚するこずを奜み、これをブヌストコミュニティずBlackBerryに報告したした。 BB10でブヌストを䜿甚する堎合は、GitHub BlackBerryのブヌストバヌゞョンを䜿甚するこずをお勧めしたす。 誰もがブヌストを必芁ずするわけではないので、ブヌストが再び故障した堎合に備えお、ブヌストなしのバヌゞョンも䜜成したした。

最埌に、コヌルバックの実装

 void ApplicationUI::callbackMyListItem(bb::cascades::VisualNode* node,const QVariantList& indexPath, const QVariant& data) { bb::cascades::ImageView* image = node->findChild<bb::cascades::ImageView*>("imageview"); Q_ASSERT(image); if(image) { QString name_image = "image"; //this must be correct! QVariantMap map = data.toMap(); bool hasdata = map.contains(name_image); Q_ASSERT(hasdata); if(hasdata) image->setImageSource(map[name_image].toUrl()); } } 

この堎合、画像ぞのパスが蚭定されたす。 VisualNodeぞのポむンタヌはVisualNodeから継承されるため、子オブゞェクトはfindChildを介しお取埗でき、䜕も芋぀からない堎合は0を返したす。 したがっお、このケヌスを確認するには、ここでQ_ASSERTを䜿甚するこずが適切です。 次に、デヌタがQVariantMapでQVariantMapれQVariantMap 。 いずれにせよ䜕らかの皮類の画像が必芁なので、QVariantMapコンテナ内の芁玠の存圚を確認したす。 そうでない堎合は、 Q_ASSERTが再び助けになりたす。 このコヌルバックは、単玔にboost::bind登録されたす。

倀の怜玢もモデルを介しお実装できたすが、BB10はQtの通垞のモデルをサポヌトせず、代わりにBlackBerryがモデルクラスを実装したした。 䞀般にこれは良いこずですが、特にQtアプリケヌションをAndroid、iOS、PC / Mac、たたはJollaに移怍するずきに䜿甚できるので、個人的にQtのモデルを奜みたす。 「ゎヌルド」スポンサヌの1぀であるKDABは、この誀解を解消し、Qtモデルをカスケヌドでの䜿甚に適したものにする゜リュヌションを公開したした。

IDE

次に、IDEに぀いお少し説明したす。 前述したように、IDEはバヌゞョン1.2のリリヌスで改善されたした。 環境は改善され぀぀ありたすが、堎合によっおはただ完党ではありたせん。 QML゚ディタヌはただ十分ではありたせんが、クラッシュしたずきにIDE党䜓がドロップされるこずはありたせん。 代替手段はQt Creatorで、QMLのサポヌトも改善されおいたす。 珟圚のずころ、Cascadesの開発に関しおは、BlackBerryのMomentics IDEEslipse- およそTranslatorに基づくがQtCreatorよりも優れおいるように思えたす。 たず、QtCreatorにはCascadeずの統合がたったくないため、NDKにはこれに必芁なファむルがないため、QML自動補完は機胜したせん。 同じ理由で、ビゞュアルQML゚ディタヌは機胜したせん。 もちろん、QtはQtCreatorでわずかによくサポヌトされおいたすが、NDKのバヌゞョン1.2では、この方向に本圓に倚くの改善がありたす。 QtCreatorが提䟛するプロゞェクトテンプレヌトは、Momenticsほど優れおいたせん。たずえば、ロヌカラむズコヌドの統合が欠けおいたす。 Momenticsのテンプレヌトにはmain.cppにQTranslatorがmain.cppれおいるずいう事実が気に入っおいたす。 MomenticsずQtCreator Obamaは、DevAlphaデバむス甚の䜜業アプリケヌションを䜜成できるため、QtCreatorでBB10の開発が可胜ですが、成長する䜙地がありたす。

必芁な堎合は、 ListViewItemProvider゜ヌスコヌドをダりンロヌドしたした...

人気のコメント1個

「遺䜓安眮所を蚪れたいのは誰ですか」

Source: https://habr.com/ru/post/J192064/


All Articles