• 11417阅读
  • 6回复

Qt3源程序升级到Qt4经历 [复制链接]

上一主题 下一主题
离线dearwjj
 
只看楼主 倒序阅读 楼主  发表于: 2010-05-12
— 本帖被 XChinux 设置为精华(2012-04-19) —
刚毕业来单位工作,部门使用的开发工具是Qt,在Linux环境下。Qt和linux以前都没接触过,正在学习中。部门现有的程序都是基于Qt3的,算是比较老的版本了,新版本增加了很多的功能,尤其希望编程时能使用Qtcreator这样方便的工具,于是萌生出想把现有的Qt3程序升级到Qt4的想法。现在我将我的工作进程贴出来与大家分享一下,有一些经验,也还有一些未解决的问题,希望大家一块讨论讨论。

我的环境是Windows下的Fedora12虚拟机环境,从官网下载最新的QtSDk(4.6.2)安装包。

简单工程的转换:

官方提供了从Qt3转换到Qt4的工具,对于比较简单的程序,转换基本依靠这些工具就可以完成。

Qt3和Qt4文件结构的简单对比

比如在Qt3的源程序中有以下文件form.ui,form.ui.h,main.cpp,form.cpp,form.cpp文件是与form.ui对应的记录ui界面特征的文件,比如按钮大小,颜色等等(好像ui界面的特征也可以全部存储在.ui文件中,这个文件好像不一定都是存在的,我现在手头的工程里有每一个ui文件有都这样的一个cpp文件,里面的代码就是设置ui外观的。但是我自己在Qt3下新建的一个简单工程没有自动生成这样的一个cpp文件),form.ui.h文件是与form.ui文件对应的界面相应和消息处理的文件,虽然这个文件是一个头文件,但是功能确是一个cpp文件,与windows下的MFC风格差别很大,Qt4的文件组织形式变得跟MFC比较像。Qt4下对应的有以下文件,form.ui,form.h,form.cpp,main.cpp. 界面特征记录在form.h文件中,消息处理和自定义函数在form.cpp中。

转换过程:

uic3 form.ui > form.h
uic3 form.h form.ui > form.cpp


这样转换生成的form.h文件和原来Qt3中form.cpp(如果存在的话)功能相同,所以原来的form.cpp文件可以删掉,新生成的form.cpp文件应该是替代form.ui.h文件功能的,但是直接复制粘贴源码工作量太大,只需在新的form.cpp文件中include form.ui.h文件即可,同时在form.ui.h文件中 include form.h,将新form.cpp文件中的#include"form.h"去掉(防止重复包含文件)。好了,现在文件的组织关系清理好了。接下来使用命令:

uic3 -convert form.ui > formqt4.ui #转换后最好再把ui文件名变成原来一样的

这个命令的功能是将qt3下的ui文件转换成qt4下的,否则在Qtcreator中无法打开。

接下来,因为qt3和qt4的库函数中有较多不一样,官方提供了qt3to4工具自动将名字修改过的库函数自动改成新的对应的库函数,并且在源程序中添加必要的头文件(注意这个工具不是一定可行的,有些qt3中的库函数可能qt4中就没有对应的函数),这个工具有两个使用方法,如果以pro文件作为参数,将会转换工程中的每一个.h和.cpp文件,执行过程中会有提示,同时也会修改.pro文件,在其中加入QT += qt3support, 好像还有uic3相关的命令,记不清了。也可以一次转换一个文件,将文件名作为qt3to4命令的参数。
转换完成后,在QtCreator中打开工程可能看不到ui文件,手动把这些文件添加到工程中,接下来编译应该就可以了,如果工程较小较简单的话。

现在遇到的问题

我现在手头的工程较大,几十个ui文件还有很多自定义的一些对象文件,代码几万行,基本按照以上的流程执行完以后工程编译中还是出现很多错误和警告(我写了两个批量转换文件的脚本,有需要的可以向我索取),其中出现的很多警告是,ignoring old commonds targets '.',还有的出错是在库里的头文件中,比如qmetatype.h这样的标准的头文件中。继续解决问题中..............

离线santhtony

只看该作者 1楼 发表于: 2010-05-12
辛苦了 加油
-------------> ------->       http://www.likeqt.com
只看该作者 2楼 发表于: 2010-05-13
么么,lz,好稀饭你。
卡巴斯基互联网安。全。套,装6。0个人版。
离线dearwjj
只看该作者 3楼 发表于: 2010-05-13
继续:发现qt3to4自动添加的头文件有很多是事重复的,还要仔细清理它自动添加的头文件。
编译出现的问题是ignoring old commond for target '.',有很多这样的问题,查看qmake生成的makefile文件,发现好像它自动生成的文件列表里边好像有空文件名,在文件列表的后面有这样的文件 xx1.cpp \  .  \ moc_.cpp,object文件列表中有 xx1.o \ .o \ moc_.o,我想可能是这些 空的“.”文件名的问题,可是这是qmake根据.pro文件自动生成的啊,并且 前面的ignoring old commond for target '.'好像是在下面的 -o后面的"."中出问题的(也不知道是不是最前面的.的问题)
.: ac_op.h \
                dict/extern.h \
                dict/define.h \
                dict/server.h \
                dict/hostuartaskary.h \
                control.h \
                xb_pa.ui
        /opt/qtsdk-2010.02/qt/bin/uic3 xb_pa.ui -o .

.: xb_sw.ui
        /opt/qtsdk-2010.02/qt/bin/uic3 xb_sw.ui -o .

.: xb_va.ui
        /opt/qtsdk-2010.02/qt/bin/uic3 xb_va.ui -o .

无从下手啊,郁闷中,照理说这是qmake自动生成的啊,我的.pro文件没问题怎么会在makefile的文件列表中有空文件名呢。我正在准备装一个较低版本的qt4的库,看这样qmake出的makefile是什么样的
离线dearwjj
只看该作者 4楼 发表于: 2010-05-13
终于发现问题了,前面说的很多ignoring old commands for target ‘.’ 是因为.pro文件中的问题,由于我也用qt3to4工具对pro文件进行了转换,结果其中定义的路径写的面目全非,还少了一个大括号,重新修正过后,Makefile文件算是正常了。所以对qt3to4这样的自动转换工具千万不能依赖太多,很多时间还是要亲自动手修改的,我要是早看了Makefile文件的编写规则或许能早点找到问题了。但是编译出错,还是标准头文件中的某处出错,不知道是不是打开的时候误修改了头文件还是什么其它原因,我从另一个虚拟机上安装的库中将相同的头文件拷贝替换,结果还是出错。哎,折腾死我了...,继续....
离线abcdlcq

只看该作者 5楼 发表于: 2012-04-27
我们用vs宏替换,100+万行代码已经完成了,关键是替换规则的整理收集和因此带来的bug修改,移植工作确实很辛苦
离线xixiguo
只看该作者 6楼 发表于: 2012-11-07
回 楼主(dearwjj) 的帖子
楼主,需要你写的那两个批量转换文件的脚本,非常感谢!526216967@qq.com
快速回复
限100 字节
 
上一个 下一个