`
tubaluer
  • 浏览: 1443376 次
文章分类
社区版块
存档分类
最新评论
  • sblig: c / c++ 是不一样的都会输出 100
    j = j++

symbian c++ 移植为 qt (1)

 
阅读更多

最近一直在做一个项目,主要是将原本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代码,在symbianpc我们可能希望其走不同逻辑段,此时要用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:。。。。。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics