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:。。。。。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值