
qt3和qt4的差异及代码转换方法.doc
4页QT3 和 QT4 的差异和转换作者邮箱:ziyan0621@ Designer 中的区别1) Qt3 到 QT4 控件名称发生了一些变化 , 如:Qt3 ListBox+ IconView 相当于 QT4 的 QListWidget;Qt3 ListView 相当于 QT4 中的 QTreeWidget;QT3 Tabele 相当于 QT4 中的 QTableWidget;另外 QT4 有基于 MODEL 和 ITEM 之分2) QT3 到 QT4 控件外形发生了一些变化 ,如:DateTimeEidt 控件,QT3 用 DateEdit 和 TimeEdit 简单组合, QT4 中将两者合成一体3) Qt4 和 Qt3 界面操作方法上有了一些变化,如:添加一个控件,Qt3 单击添加一个或者双击批量添加,Qt4 采用拖放操作Qt3 ctrl+T 进行运行测试,Qt4 ctrl+R4) Qt3 中一些功能在 Qt4 中已经废除,如:Qt3 中可以添加槽函数,并将信号关联到自己添加的槽函数,uic 后槽函数为虚函数,留给用户重写Qt3 中可以添加 C++代码的.h 和.cpp 文件,无需在 VC 中添加。
5) Qt4 中很多新功能, 如:属性编辑器有过滤功能;Qt4 具有强大 rcc 资源编译器的功能,可以将图片,文件等等加入资源 qrc 中,用rc编译6)Qt3 中 QLabel 设置背景的方法:SetPaletteBackgroundPixmap 在 Qt4 中变成为setPixmap7) QHBox 这种类没有了,都需要改用 QHBoxLayout 来布局就是先 new 一个QWidget 出来,然后用这个 Widget 的 setLayout 方法来加入 Layout8) QApplication 的 setMainWidget 方法没有了,不需要手动设置主窗口部件,似乎自动就设置好了9) QWidget 中的 setCaption()方法改成了 setWindowTitle()10) QDialog 的构造函数有变化,不再有 QDialog(QWidget *, const char*)这种形式的构造函数了11) QLineEdit 类的 isOn()方法改成了 isChecked()12) QAsciiDict在 Q3Support 库中变为 Q3AsciiDict,在 Qt4 中由QHash代替,Q3AsciiDictIterator 由 QMultiHash代替13) Q3Button 变为 QAbstractButton,Q3Button ::drawButton(QPainter*)由QWidget::paintEvent()实现14) setPixmap()由 setIcon()代替15) Q3ButtonGroup 由 Qt4 中 QGroupBox 代踢16) Q3Cache由 Qt4 中 QCache代替17) Q3 中 QPalette 由 3 个 QColorGroup 对象组成,在 Qt4 中使用 QPalette 代替QColorGroup,The new QPalette still works in terms of color groups, specified through enum values (QPalette::Active, QPalette::Disabled, and QPalette::Inactive). It also has the concept of acurrent color group, which you can set using QPalette::setCurrentColorGroup().18)Q3Dict在 Qt4 中使用 QHash和 QMultiHash20)Q3Header 变为 QHeaderView21)QIconFactory 在 Qt4 中被 QIconEngine 代替22)QIconSet 由 Qt4 中的 QIcon 代替23)QImageDrag 由 Qt4 中的 QMimeData 代替,使用 QMimeData::setImage 设置图片24)Q3MainWindow 由 QMainWindow 代替25)QMemArray,QPtrVector由 Qt4 中的 QVector代替26)Q3MimeSourceFactory 由 Qt4 的 Resource System 代替27) Q3MultiLineEdit 在 Qt3 中继承自 Q3TextEdit,在 Qt4 中由 QTextEdit 代替28)QPtrList, QPtrListIterator, QPtrListStdIterator在 Qt3Support 库,在Qt4 中用 QList或 QLinkedList代替29) Q3ValueList转换为 QLinkedList30)QPtrStack在 Qt4 中由 QStack代替,remove—>pop,currentop31)在编译后生成的 ui_xx 文件中,如果没有成员变量的话可以再 Designer 中将其属性去掉即可32)Qt3 中关于图片加载问题,可以在 Qt4 中通过 Qt Resource System 来解决。
33)QWorkspace 由 QMdiArea 来代替 Pro 文件的区别1) 变量发生了变化ui 文件添加 INTERFACES +=变成 FORMS+=;资源文件添加 IMAGES += 变成 RESOUCES+=库文件添加 LIBPATH 变成 QMAKE_LIBDIR 框架发生了很多变化1) 一些类已经废除,如:QCString ,还记得 QString::setCodecForCString, 主要是为了设置 Q3CString 类中的文字的编码格式Q3PointArray, QMimeSource(用来加载图片资源), QPtrList(Qt3 中没有 QList,只能 保存指针类型),QStrList 2) 一些类名称发生了改变,如:QIconSet 改名为 QIcon, QWorkSpace 改名为 QMdiAreaQPopupMenu 变成QMenu3) 一些类的功能发生了分离,如:Qt3 的 QPainter 类到 Qt4 中分成 QPainter 和 QPainterPath,如 moveTo, lineTo 等已经放入到 QPainterPath,中处理。
4) 一些类功能发生了合并,如:QColorGroup+QPalette 合并为 QPalette.5) 类的接口发生了改变,在许多类中有很多 Qt 3 support members,就是原来 Qt3 的接口功能,Qt4 中已经废除了,只不过为了兼容 Qt3 还保留或者恢复了一些6) 类的继承关系发生了很多的变化,如:QThread Qt3 中从 Qt(在 Qt4 中改成了了 namespace)继承,Qt4 中从Object继承,因此可以在 QThread 中直接使用信号和槽 Qt 的变化给 Qt3 转换 Qt4 带来的影响1) 类和接口等名称的改变使得转换后的代码有很多类、接口、枚举等等找不到,具体解决方法:用 Qt4 重写代码、用 Qt 3 support 的暂时代替2) Qt 3 support 的接口在 Qt4 中通常是调用已经实现的 Qt4 的接口来实现的,和 Qt3 的实现方式存在一些区别因此通常会出现一些和以前程序效果不一样的地方3) Qt 在实现同一种功能的时候往往会提供多种处理方案比如:实现 QTableWidget 右击菜单,可以继承下来重写 contextMenuEvent 虚函数,或者直接用 addAction 接口添加右击菜单菜单项,无需麻烦继承;处理一个 QWidget 对象的 mousePressEvent 事件的时候可以继承下来处理,也可以用QObject 提供的 intallEventFilter 接口交个另外一个对象处理,这样也无需麻烦继承;在 QMenu 中添加了许多 QAction,要获取 QAction 的响应槽函数可以对每个QAction 的 void triggered(bool checked = flase)信号进行关联,也可以对 QMenu 的 void triggered(QAction *action)信号进行关联,进行统一的处理。
用不同方式实现会使得程序的结构不一样,因此可以自己选择来更好的优化代码的结构Qt3 转 Qt4 后有很多方式可能已经不再支持,这样要彻底转换就必须修改大量代码来改变程序的结构 Qt3 转 Qt4 的经验总结1) 转换工具:用 Qt4 自带的 Qt3To4 转换工具进行 Qt3 转 Qt4,目前还未发现其它转换工具2) 无 ui 文件的 project 的转换,主要是一些动态或静态库的转换对于Qt4 的程序是不可以直接调 Qt3 的库的,如:Qt3 库的某个接口的返回值为QString,那么 Qt4 是无法获取该变量的值,因为 Qt4 和 Qt3 在实现上内部内存分配方式是不一样的具体转换过程如下:a) 打开控制台,将目录设置到工程目录下,用 qt3to4 工具,具体如:qt3to4 qt3dlltest.pro,提示一些文件将会转换,选择 all(全部转换),将会产生一个 portinglog.txt 的移植日志文件,里面详细记录了所有文件被修改的情况b) 用 qmake –tp vc 生成 VC 工程,可以看到代码中多了一些注释://Added by qt3to4: 另外在 Pro 文件中多了:#The following line was inserted by qt3to4QT += qt3support 等等, 这些主要是转换后的程序用了很多 Qt4 提供的兼容 Qt3 的一些类、接口等等。
要想不使用这些兼容的功能只能手动修改成纯 Qt4 的代码c) 修改其它一些错误,主要是 Qt4 不兼容 Qt3 的一些代码3) 带 ui 文件的 project 的转换:首先要说明 Qt4 有两种 ui 文件的编译器程序:uic 和 uic3,uic 是 Qt4的 ui 编译器,uic3 是保留的 Qt3 的 ui 编译器如果采用无 ui 文件的project 的转换的方式,将会在 pro 文件中发现,如:#The following line was changed from FORMS to FORMS3 by qt3to4FORMS3 += qt3test1.ui#The following line was inserted by qt3to4QT += qt3support #The following line was inserted by qt3to4CONFIG += uic3可以看出这种转换方式转换后的程序的界面仍然是 Qt3 的界面,不能满足移植的目的需求,因此要先把 ui 文件先转成 Qt4 的 ui 文件具体转换方法有如下 2 种:a) 用 uic3 –convert qt3test1.ui > qt4test1.ui ,再将转换后的 ui 名称改成和原来一样的。
b) 直接用 Qt4 的 Designer 打开文件,提示文件将会从 Qt3 转为 Qt4,确定后直接保存该文件就可以了Ui 文件转化好后再用 qt3to4 工具进行转换,打开 pro 文件,照样可以看到:#The following line was changed from FORMS to FORMS3 by qt3to4FORMS3 += qt3test1.ui#The following line was inserted by qt3to4QT +。












