文章出处:http://blog.csdn.net/jack0106
作者联系方式:冯牮 fengjian0106@yahoo.com.cn
不同版本的meego系统,底层和中间层架构,大体是一致的,也是可以定制裁剪的。区别主要在最上层的用户体验层,比如handset版和notebook版的meego,UI就很不一样(UI的开发环境,也不一样),这篇文档,是针对handset版meego的学习路线,做的一个总结。后面提高到的meego,未做明确说明的情况下,都是特指handset版的meego系统。
一、基础
1、编程语言
1.1 meego的图形界面,是基于qt开发的,不用说,C++肯定是首选的开发语言。
1.2 STL的使用。qt自己实现了一套类STL接口,和标准的STL仅有一些小的区别,而且也有api文档。之所以单独提到STL,是因为这个东西太重要的,它的核心内容,就是容器和算法,这是c++程序中最基本的数据操作,一定要掌握。(初学者,可以通过STL的中文教程来学习,然后很容易就能转到qt的类stl接口上编写代码)。
1.3 meego是的中间层,不全是由qt开发的,其中的一部分,是由c语言写出来的。其实meego上很多中间层的服务程序,都是直接用的gnome桌面环境中的开源项目,而gnome的基础,就是基于c语言的gobject系统,所以,c语言也是一个重要的开发语言。
但是,c并不是必须的,如果懂c,相当于锦上添花,后面在第二部分,我会详细的解释。
2、明确一些概念
2.1 首先明确一点,qt不仅仅是用来绘图的,qt其实是一个很完善的底层库,除了绘图,qt还融合了很多和UI无关的功能,比如网络、xml、sql等等,qt都有相关的类和框架。
2.2 meego是基于qt的,准确点描述,可以是这样:meego继承qt,开发了一套GUI库--libmeegotouch,meego的界面,就是用libmeegotouch开发的,而隐藏在界面背后的功能性的代码,则是用qt开发的。
2.3 qt有一个非常好的文档系统和众多的example code,一定要充分利用。
2.4 虽然libmeegotouch也有文档和example code,但是,由于libmeegotouch仅仅是负责绘制GUI,它的example code有局限性,而且数量也较少,因此对于开发人员,一定还要通过qt example code来深入学习。
3、qt/meego基础学习
3.1 qmake的使用。qt程序使用qmake和pro文件进行工程管理。请看文档 qmake Tutorial --http://doc.qt.nokia.com/4.7/qmake-tutorial.html
3.2 qt的对象系统。请看文档 Object Model -- http://doc.qt.nokia.com/4.7/object.html
和 The Property System -- http://doc.qt.nokia.com/4.7/properties.html#qt-s-property-system
3.3 qt中的信号和槽函数,这是qt的特色之一,是对c++扩充后的新概念。请看文档 Signals & Slots --http://doc.qt.nokia.com/4.7/signalsandslots.html
3.4 qt中的事件传递和主事件循环,请看文档 The Event System --http://doc.qt.nokia.com/4.7/eventsandfilters.html 和 Another Look at Events -- http://doc.qt.nokia.com/qq/qq11-events.html,初学者可能会觉得这里很抽象,要理解事件循环,更基础的一个概念是文件的异步操作(select/poll/epoll 函数),这个可以随着开发的深入再慢慢体会。
3.5 qt中的容器类,这就是前面提到的qt中的类STL接口,请看文档 Container Classes --http://doc.qt.nokia.com/4.7/containers.html
4、meego/qt中的widget
4.1 不管是哪一种GUI库,都有widget的概念,相当于windows编程中的控件。按钮、文本编辑框、下拉菜单,这些都是widget,widget概念的引入,使得图形界面编程更加的方便快捷。
4.2 qt里面,有两套绘图系统,一套是QWidget+QLayoutItem系统,这个是桌面环境编程中使用的widget,另一套是Graphics View Framework,这套系统比xserver更灵活,可以对基本的图形元素做旋转操作,也初步实现了widget的父类QGraphicsWidget,但是并没有进一步实例化。
关于Graphics View Framework,请看文档 Graphics View Framework --http://doc.qt.nokia.com/4.7/graphicsview.html
4.3 meego是使用在小屏幕设备上的一个系统,如前所述,QWidget是为桌面环境设计的,不适合手持设备,虽然QGraphicsWidget并不完善,但是Graphics View Framework有很强的灵活性,所以meego选择从QGraphicsWidget继承,专门为小屏幕设备实现了一套widget库--MWidget。
QWidget和MWidget虽然是两套不同的widget,但是在设计理念和设计模式上,基本是相同的,尤其是layout系统,使用方法都是类似的。因此,如果已经熟悉QWidget了,则MWidget也可以很快的上手。如果是新手,则可以通过QWidget+QLayoutItem相关的技术文档来学习qt中layout的基本思路,然后再阅读MWidget的example code。下面给出一些参考文档,
Layout Management -- http://doc.qt.nokia.com/4.7/layout.html
Widgets and Layouts -- http://doc.qt.nokia.com/4.7/widgets-and-layouts.html
MWidget Layout -- http://apidocs.meego.com/1.1/platform/html/libmeegotouch/layouts.html
Common Components -- http://apidocs.meego.com/1.1/platform/html/index.html
4.4 在熟悉了widget+layout的基本理念和使用方法后,就可以开始看meego的example code了,阅读libmeegotouch的源码目录中的example子目录中的代码,这是学习meego开发的最好的办法。首先推荐阅读的是example目录中的子目录 tutorial_music_catalogue,关于这个代码,可以参考文档http://apidocs.meego.com/mtf/tutorial.html 中的介绍。
4.5 qt中的widget,数量巨多,很容易让人产生恐惧感。但是到了meego中,由于是为手持设备设计的,屏幕较小,widget的数量也少了很多,常用的widget,目前就只有10多个,像按钮、文本编辑框这一类widget,用法都很简单,很容易上手。唯一一个有一定难度的widget,就是MList,这个东西是手机上常用的一种widget,就是一个长的列表。MList使用了qt中的model/view framework,请看文档 http://doc.qt.nokia.com/4.7/model-view-programming.html。libmeegotouch源码目录example中的子目录,apscanner,是一个使用了model/view框架的例子,要通过这个代码学习MList的使用。
5、meego/qt中常用的框架、技术
5.1 动画框架,qt提供了一个Animation Framework,可以让widget动起来(其实是让QObject动起来),请看文档 The Animation Framework -- http://doc.qt.nokia.com/4.7/animation-overview.html
5.2 qt中的多线程,请看文档Thread Support in Qt -- http://doc.qt.nokia.com/4.7/threads.html
5.3 meego是为手持设备设计的,而现在流行的手机终端,都有触摸屏,qt中,也提供了对触摸屏手势的支持,请看文档
Gestures Programming -- http://doc.qt.nokia.com/4.7/gestures-overview.html
Gestures and Multitouch -- http://apidocs.meego.com/1.1/platform/html/index.html
5.4 meego中,为widget引入了css的概念,可以用css文件来控制MWidget的许多属性,请看文档 css in meego -- http://apidocs.meego.com/1.1/platform/html/libmeegotouch/styling.html
5.5 meego的国际化处理,是基于qt的国际化方案的,请看文档
Internationalization with Qt -- http://doc.qt.nokia.com/4.7/internationalization.html
Internationalisation Guidelines -- http://apidocs.meego.com/1.1/platform/html/libmeegotouch/i18n.html
二、深入
前面的介绍,着重于meego开发的基本技能,尤其是widget的使用。隐藏在GUI后面的功能性代码的开发,meego也提供了很多优秀的编程框架。
1、进程间通信。linux桌面环境最常用的通信方式是dbus,而且dbus已经成为一个标准,meego自然也是使用dbus。
1.1 dbus原生是用c语言开发的,同时可以绑定到很多面向对象的编程语言之上,详细介绍,可以参考http://www.freedesktop.org/wiki/Software/dbus
1.2 gnome桌面开发中,使用的是dbus-glib库,这个是基于gobject对象系统的c库,详细介绍,可以参考http://library.gnome.org/devel/dbus-glib/unstable/index.html
1.3 qt中也绑定了dbus,详细介绍,可以参考http://doc.qt.nokia.com/4.7/intro-to-dbus.html
2、数据库
2.1 meego平台上使用了一个中心数据库,tracker,这个也是gnome桌面项目中发展起来的一个技术,详细介绍,可以参考 http://projects.gnome.org/tracker/
2.2 gnome桌面开发中,使用的是tracker库(基于dbus),是基于gobject对象系统的c库,可以从http://ftp.gnome.org/pub/GNOME/sources/tracker/0.9/ 下载
2.3 qt也对tracker做了一个绑定,有一个libqttracker库,可以从 http://maemo.gitorious.org/maemo-af/libqttracker/trees/master 下载
3、多媒体编程
3.1 qt有一套多媒体编程框架Phonon ,但是这并不是qt的最终目标。可以忽略这个框架。
3.2 qt现在有一个单独的项目,qt-mobility,其中有一个新的多媒体编程框架 Multimedia --http://doc.qt.nokia.com/qtmobility-1.1.0/multimedia.html,这个才是qt将会主推的方案,meego上也是用的这套框架。
3.3 如果只是开发音频/视频播放器,Multimedia已经足够了,它把很多编解码的细节都隐藏了,开发者可以集中精力开发用户体验。Multimedia的后端,使用的是gstreamer,gstreamer是gnome桌面项目中发展起来的一套多媒体编解码框架,是基于gobject对象系统的c库,可以参考http://www.gstreamer.net/ ,如果需要灵活的开发功能更复杂的多媒体程序,则可以使用gstreamer框架。
4、即时通讯程序
4.1 gnome桌面项目中,发展了一个即时通讯的库,telepathy(基于dbus),这是一个框架,可以把不同的即时通讯程序协议容括进来,可以参考 http://telepathy.freedesktop.org/wiki/
4.2 原生的telepathy,是基于gobject开发的c库,可以参考 http://telepathy.freedesktop.org/doc/telepathy-glib/和 http://telepathy.freedesktop.org/doc/book/
4.3 qt也绑定了telepathy,提供了一个c++接口,可以参考 http://telepathy.freedesktop.org/doc/telepathy-qt4/
5、meego开发中的c语言
从前面介绍的4个框架来看,原生都是用c语言开发的,而且都有基于gobject系统的c接口。qt做的,主要是对这类底层库的一个上层封装,或者是编程语言的绑定。对于开发者,在学习这些框架的时候,如果了解gobject系统,学习起来肯定会更方便,而且很多可以参考的文档,也都是以c语言的原生接口为例的,包括大量的example code,也是用c写的。所以,在开发过程中,基于gobject对象系统的c编程,是开发者的第二个有力工具。