BB10 NDK Cascades 框架简介和QT使用教程(与Nokia Symbian QT的区别)

1.BB10的战略架构与新机遇
       BB10平台的战略架构跟iOS是一致的,将会引入Native的代码。相比以往BB平台所使用JAVA开发,现在提出的Native的代码,将会更加高效与迅速。
       此外BB10平台提供更多优秀开源的C++库供开发者使用,著名的二维码ZXing(斑马线)库、STL、基础C库等,全部都能无缝的在BB10平台上运行。
       更加令人惊喜的是开源游戏引擎也能方便大家使用,令人熟知的Box2D(愤怒的小鸟使用的物理引擎),最近很火的Cocos2D-X(捕鱼达人),都能在BB10平台上得以展现,用这些引擎所开发的游戏,能够几乎不做修改的运行在BB10平台。
BB10平台内部引入Android虚拟机,能够将apk转化到bar,部署在BB10平台上。拥有Android应用的开发者,能够直接将自己的应用部署到BB平台。


2.Cascades对Qt库的支持程度
        QtCore、QtNetwork、QtSql、QtXML,Cascades中,支持这四个Qt的类库,但也不仅仅是这些。关于这些库中所能提供的类,请参阅如下地址:
https://developer.blackberry.com/cascades/reference/qt_index.html
        官方的Qt类库中并没有QImage、QPixmap、QString这样的基础类,但是实际使用中,仍然可以使用,所以建议Symbian开发者,用Qt中的Helper查阅相关的类,这将是查阅Qt类最快速的方法。
        此外,Symbian中的一些QtGui、QtMultimedia、QtOpenGL、QtOpenVG、QtScript、QtScriptTools、QtWebKit、Phonon、QAxContainer、QAxServer、QtUiTools等模块皆不可使用。部分模块如Multimedia、OpenGL,在Cascades官方的类库中,已经被得到重写,在BB10平台开发,不支持的Qt库将不能被调用。
        Cascades引用了Qt的信号、槽机制,只要Cascades类导入QObject头文件,并继承QObject,而且在类的开始定义了Q_OBJECT宏定义,就能像使用Qt信号、槽一样,去绑定信号和槽。定义信号、槽和触发信号和槽跟Qt完全相同。signals和slots等关键词还不能在IDE中高亮显示,官方网站透漏,9月的更新,将会加入这些关键词的高亮显示。


3.何谓Cascades
        Cascades是对于BB10平台Native代码的封装,Cascades封装的类继承了Qt类库的优秀经验,Q_OBJECT、Q_PROPERTY、Q_INVOKABLE等重要宏定义也被使用在了现在的Cascades类库中。Symbian程序员能够完全以使用Qt类一样的方式,去使用Cascades,这完全是无缝的。
        此外做一个重要的解释,Cascades现在封装的还不够,官方文档仍然不够详细,所以实际项目开发过程中,可能要涉及Native C/C++的调用。在Native SDK框架下,Cascades和Native C\C++是完全可以互相调用的,不存在界限。


4.为Cascades所要做出的改变
(1)略有差异的QML
在Qt中,Rectangle我们经常用来去描画一个矩形,或者是作为承载其他对象的容器,但是在Cascades,已经没有Rectangle对象,取而代之的是Container对象,用于承载其他对象。
总体来说,从Symbian跨越到Cascades,QML已经被黑莓官方重新封装过,有些Cascades类可以直接使用在QML中,但是有些类需要通过qmlRegisterType去注册到QML中。所有可以使用的QML对象将列在如下地址中:
https://developer.blackberry.com/cascades/reference/cascades.html
其中包含了Cascades所有支持的类,所能被QML引用到的属性,会列在QML properties里:
能被QML使用的信号在QML signals里:
能够被QML调用的方法,会有Q_INVOKABLE宏声明写在前面,如下所示:
在Cascades中,语法规则与Quick UI的语法基本保持一致,但是规则被加强,对象与对象的嵌套,必须放在合适的属性当中。比如Container对象中,需要含有Button、Container或其他对象,那么就需要把子控件放在Container中的content属性中,如:
Container{
content: Container{
}
}
部分情况下,content属性可省略。Content属性是接收bb::cascades::Control这个类对象,那么QML下的所有控件都是继承过Control类的,那么就能传入这个属性,具体开发中,调用QML控件的属性或者方法时,需要参照文档,传入合适的参数。
值得强调的一点,Symbian程序员喜欢用MouseArea对象,但在Cascades中,需要使用GestureHandler,或者是对象的onTouch信号。Cascades中的GestureHandler提供的手势有TapHandler(单击)、DoubleTapHandler(双击)、PinchHandler(两指)、LongPressHandler(长按)。滑入滑出或者复杂的手势,需要在onTouch、onTouchCapture、onTouchEnter、onTouchExit、onTouchPropagationModeChanged中,根据参数,去判断需要的手势,具体请详见官方文档。
(2)数据访问
        Symbian开发者可以使用QML下的openDatabaseSync()方法去创建一个临时的sqlite,或者使用QtSql库去创建sqlite关系型数据库。经测试,在Cascades中,QML中的临时数据库支持有问题,但是QtSql库能够很好支持。在Cascades中,提供两种非常容易使用的数据源――Json、Sql。
        如果Cascades项目需要使用非关系型数据库,那么JSON绝对是不二之选。Cascades已经帮开发者封装了一个非常方便的库,能够对JSON文件进行读取、写入操作,官方参考文档请访问:
https://developer.blackberry.com/cascades/documentation/device_platform/data_access/working_with_json.html
        如果项目的数据关系比较复杂,需要以关系型数据库的方式去管理,那么既可以选择QtSql,也可以选择Cascades官方提供的封装类,具体可参考如下地址:
https://developer.blackberry.com/cascades/documentation/device_platform/data_access/working_with_sql.html
(3)新的UI布局
        Symbian开发者经常可能会使用Symbian中的ToolBar,但在Cascades中,支持TabbedPane、NavigationPane,具体可以体验BB10设备的官方Sample编译后的应用。
        此外Symbian中的Row、Column对象已经不能使用,需要使用Cascades中的Layout去实现控件的布局。Layout布局包含StackLayout(栈式布局)、AbsoluteLayout(绝对定位布局)、DockLayout(盒式布局)、FlowListLayout(浮动列表布局)、GridLayout(网格布局)、StackListLayout(栈式列表布局)。每个控件的布局属性,可通过LayoutProperties去进行设置。
        值得强调一点,关于布局,控件去使用LayoutProperties设置之前,需要在父级对象的Layout中设置布局。比如:

        在Symbian中,PageStackWindow可以将其他qml界面push进来,而在Cascades中,根据不同的Pane,会有不同的方法去push界面。NavigationPane会需要在跳转的信号当中,用id去调用NavigationPane,然后使用deprecatedPushQmlByString("NewPage.qml")去跳转,但是官方文档声称,这个方法是临时的,正式发布时候将会被替换。我估计是会替换为push("NewPage.qml")这个方法,现在这个方法还暂时不能使用。对于TabbedPane,需要将不同Tab的内容,写在同一个qml中,用Tab对象将其括起来,如:
TabbedPane{
    Tab{
        Page{
        }
    }
    Tab{
        Page{
        }
    }
    Tab{
        Page{
        }
    }
}
(4)安全沙箱
        相信做Symbian的开发者,对Symbian的安全性真的不敢恭维,我曾在Symbian中,做了一个扫描手机所有图片的小程序,我的程序竟然能访问到手机上,除Symbian系统以外的任何位置,但在Cascades中,以安全著称的黑莓是不会允许你这么做的。
        BB10平台引入了安全沙箱机制,一个应用只能访问一些特定的目录,且不能干扰到其他应用的正常运行。具体请访问如下地址:
https://developer.blackberry.com/cascades/documentation/device_platform/filesystem/index.html
        关于应用所能访问的目录,请自行参阅文档。通过实机连接到电脑上,是不能看到应用的沙箱的,如果需要看,请在IDE中,点击菜单栏的Windows -> Show View -> Target File System Navigator,选择连接好的手机,查看自己的沙箱。如果需要把一个外部目录加入到自己应用的Assets沙箱中,必须通过bar-descriptor.xml中的Assets这一项,把目录添加进去。否则编译后是不会把外部目录添加进沙箱的。
(5)权限控制
        基于安全沙箱的系统,对权限的限制也很多。Symbian开发者经常会跟Ability打交道,以此获得访问一些特定权限的API。在Cascades中,需要在bar-descriptor.xml中设置Permission,设置过Permission后的应用,会在第一次运行告知用户需要哪些权限,没有权限,就不能进行响应的操作。权限包括,声音播放、文件访问、网络访问、GPS支持等等。
(6)QML与C++集成
        Cascades平台跟Symbian几乎一样,能够注册C++类到QML,能够将C++对象设置为QML的Context。不仅如此Cascades提供更加灵活的对象访问方式,能够通过objectName找到一个对象,将其引用传给C++的指针,当然这个指针不能在C++中释放,否则会导致程序崩溃。关于QML与C++集成,请参考如下链接:
https://developer.blackberry.com/cascades/documentation/ui/integrating_cpp_qml/index.html
        其中列举出C++跟QML交互的所有方式,其中最后一节讲到能将控件注入到某个特定QML对象中,将会对开发有很大帮助。
5.开始你的Cascades之旅
        至此,Cascades对于Symbian开发者的基础入门教程已结束,如果需要更多的技术支持,请登陆中国黑莓开发者群组网(http://www.cnbbdevgroup.com/)。更多技术细节,可以参考黑莓开发者网站(https://developer.blackberry.com/)

你可能感兴趣的:(愤怒的小鸟)