最近一直在做一个项目,主要是将原本symbian c++写的工程移植为qt版本。这其中遇到N多问题,自己也鲜有总结,接下来几篇文章就总结一下这其中的一些方法经验和教训,大家一起交流。
symbian发展到symbian3和symbian4之后:原本的symbian c++生存空间越来越小,而qt将最终成为主要的趋势。所以原本很多用symbian c++写的项目都面临着一个问题:要么最新版本全部推倒用qt重写,要么做移植。 可能很多人会说:symbian c++的框架和使用方法与qt相差极大,不如重写来的划算,实则不然,以我的经验来看:还是移植速度更快,风险更小。如果重新推倒用qt来写,也许做UI会非常快的实现,但是后期与底层引擎的连接以及原本的架构逻辑都面临极大挑战,或者根本就不适用了已经。所以:我建议还是移植的好,这样有错误也会有对照。
1:移植开发环境的搭建。
可以直接使用qtSDK,安装一下就OK,但是我不推荐这个,基于以下原因:
①qt creator这个ID很不成熟,编译调试时会出现很多莫名其妙的错误,而且gcc编译器本身速度很慢,如果工程很大,那编译一次的速度足够受的,这极大的降低了开发效率和工程进度。
②qt-mobility有些功能我们发现在qt-creator下是无法debug的,断点都进不去。
③项目中可能有很多原symbian c++程序员,让其接触这个还是要有个过程,而且又这么多问题··
所以我还是推荐用vc + carbide 结合的方式,在windows下用vc来开发调试;而在symbian环境下则用carbide。vc编译速度绝对快,并且相当稳定。而carbide就是正牌的symbian标准环境,远symbian c++程序员也相对熟悉。
2:相关移植原则:
①尽可能在源头移植,保持代码的统一性.
Example :
symbian
系统事件和
qt
系统事件定义不同,而在程序中有大量的传递使用。那么我们应该在最源
头获得该事件后就对 其进行移植转换
.
Qt
下的事件为
QMouseEvent.
而
symbian
下位
TPointEvent.
在移植时:我们需要如下做
:
(1)
在
pc
环境下自定义一个类
TPointEvent,
其定义照抄
symbian
源码。
(2)
写一个转换函数
QMouseEvent2TPointEvent
()将系统获得的
QMouseEvent
事件转为
TPointEvent
事件。
(3) 这样当控件收到QMouseEvent鼠标事件时:我们只需要调用QMouseEvent2TPointEvent()将之转为TPointEvent,而后逻 辑上事件的传递等我们就可以继续沿用原symbian的代码使用TPointEvent了。而不用没处都对应修改。
(4) 可能有人说了:你这样做之后在windows环境下没问题,但是在symbian下不会报错重复定义吗?的确会报。所以我们只需要
将照抄TPointEvent的定义用系统平台宏包裹起来,在windows下用我们自定义的,而在symbian下用symbian系统定义的
即可。
②能在
windows
下调试的尽可能全部在windows下调试。
由于pc环境下调试速度的先天优势,我们能在windows下调试的代码绝对不要先拿到symbian环境下调试,毕竟启动模 拟器什么的都很慢。
Example :
如用到
QtMobility
相关功能,则需将对应部分设置一个开关。因为这部分只能在模拟器或者真机
下调试
,pc
上无法调 试
.
所以为了其余模块在
pc
下的调试须设置开关
,
以方便在不同平台上的打开关闭
.
③能使用系统宏则不使用自定义宏
.
Example :
对
qt
代码,在
symbian
和
pc
我们可能希望其走不同逻辑段
,
此时要用
qt
平台宏进行区分
,
不要使用自
定义宏
.
比如:程序我 们在
symbian
下指定尺寸为全屏,但在
pc
下则指定为正常尺寸。此时我们需用系统平台
宏进行区分。 不要用自定义宏,毕竟手动控制 不如系统控制来的自然自动和严谨。
ifdef
Q_OS_SYMBIAN
widget->resize(screenSize);
elif defined
Q_OS_WIN32
widget->resize(QSzie(360,640));
#endif
3:移植方法:
1:qt能实现的全部用qt来做,对于一些qt目前无法实现的,需要用PIMPL设计模式来分离实现,方便后续跨平台。目前qt对桌面环境的支持比较好,但是对移动平台的支持还是不怎么好的,所以后边才出了qt-mobility等补充移动功能。而qt-mobility目前对移动特性也仅仅是支持了一部分,还有很多常用功能暂时是没有提供支持的,所以需要我们混合编程。这里的混合编程如果理解为里边夹杂symbian代码那也不好,毕竟我们还要在pc下调试,夹杂这些在pc下就没法运行了,所以还会是用PIMPL模式来实现接口实现相分离比较好。wiki上有一篇文章专门是说这个的,但是我看那篇文章说的不是很直白,很多东西明明一两句就可以说明白,它非要饶着说,也可能外国人的风格和国人不一样吧。我写了一篇文章简单解释了一下,有兴趣可以先看下再去看那篇。PIMPL这个东西用一次你就会觉得妙用无比了。
我项目接触中发现的qt for symbian无法实现的功能有:
1:手机震动功能
2:手机桌面托盘
3:手机前后台切换事件处理
4:。。。。。