您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 广告经营 > QT3和QT4的差异及代码转换方法
QT3和QT4的差异和转换作者邮箱:ziyan0621@126.comDesigner中的区别1)Qt3到QT4控件名称发生了一些变化,如:Qt3ListBox+IconView相当于QT4的QListWidget;Qt3ListView相当于QT4中的QTreeWidget;QT3Tabele相当于QT4中的QTableWidget;另外QT4有基于MODEL和ITEM之分。2)QT3到QT4控件外形发生了一些变化,如:DateTimeEidt控件,QT3用DateEdit和TimeEdit简单组合,QT4中将两者合成一体。3)Qt4和Qt3界面操作方法上有了一些变化,如:添加一个控件,Qt3单击添加一个或者双击批量添加,Qt4采用拖放操作。Qt3ctrl+T进行运行测试,Qt4ctrl+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方法来加入Layout。8)QApplication的setMainWidget方法没有了,不需要手动设置主窗口部件,似乎自动就设置好了。9)QWidget中的setCaption()方法改成了setWindowTitle()。10)QDialog的构造函数有变化,不再有QDialog(QWidget*,constchar*)这种形式的构造函数了。11)QLineEdit类的isOn()方法改成了isChecked()。12)QAsciiDictT在Q3Support库中变为Q3AsciiDictT,在Qt4中由QHashKey,T代替,Q3AsciiDictIteratorT由QMultiHashKey,T代替13)Q3Button变为QAbstractButton,Q3Button::drawButton(QPainter*)由QWidget::paintEvent()实现14)setPixmap()由setIcon()代替15)Q3ButtonGroup由Qt4中QGroupBox代踢16)Q3CacheT由Qt4中QCacheQString,T代替17)Q3中QPalette由3个QColorGroup对象组成,在Qt4中使用QPalette代替QColorGroup,ThenewQPalettestillworksintermsofcolorgroups,specifiedthroughenumvalues(QPalette::Active,QPalette::Disabled,andQPalette::Inactive).Italsohastheconceptofacurrentcolorgroup,whichyoucansetusingQPalette::setCurrentColorGroup().18)Q3DictT在Qt4中使用QHashKey,T和QMultiHashKey,T20)Q3Header变为QHeaderView21)QIconFactory在Qt4中被QIconEngine代替22)QIconSet由Qt4中的QIcon代替23)QImageDrag由Qt4中的QMimeData代替,使用QMimeData::setImage设置图片24)Q3MainWindow由QMainWindow代替25)QMemArrayT,QPtrVectorT由Qt4中的QVectorT代替26)Q3MimeSourceFactory由Qt4的ResourceSystem代替27)Q3MultiLineEdit在Qt3中继承自Q3TextEdit,在Qt4中由QTextEdit代替28)QPtrListT,QPtrListIteratorT,QPtrListStdIteratorT在Qt3Support库,在Qt4中用QListT或QLinkedListT代替29)Q3ValueListT转换为QLinkedListT30)QPtrStackT在Qt4中由QStackT*代替,remove—pop,currentop31)在编译后生成的ui_xx文件中,如果没有成员变量的话可以再Designer中将其属性去掉即可32)Qt3中关于图片加载问题,可以在Qt4中通过QtResourceSystem来解决。33)QWorkspace由QMdiArea来代替Pro文件的区别1)变量发生了变化ui文件添加INTERFACES+=变成FORMS+=;资源文件添加IMAGES+=变成RESOUCES+=库文件添加LIBPATH变成QMAKE_LIBDIR框架发生了很多变化1)一些类已经废除,如:QCString,还记得QString::setCodecForCString,主要是为了设置Q3CString类中的文字的编码格式。Q3PointArray,QMimeSource(用来加载图片资源),QPtrList(Qt3中没有QList,只能保存指针类型),QStrList2)一些类名称发生了改变,如:QIconSet改名为QIcon,QWorkSpace改名为QMdiArea。QPopupMenu变成QMenu。3)一些类的功能发生了分离,如:Qt3的QPainter类到Qt4中分成QPainter和QPainterPath,如moveTo,lineTo等已经放入到QPainterPath,中处理。4)一些类功能发生了合并,如:QColorGroup+QPalette合并为QPalette.5)类的接口发生了改变,在许多类中有很多Qt3supportmembers,就是原来Qt3的接口功能,Qt4中已经废除了,只不过为了兼容Qt3还保留或者恢复了一些。6)类的继承关系发生了很多的变化,如:QThreadQt3中从Qt(在Qt4中改成了了namespace)继承,Qt4中从Object继承,因此可以在QThread中直接使用信号和槽。Qt的变化给Qt3转换Qt4带来的影响1)类和接口等名称的改变使得转换后的代码有很多类、接口、枚举等等找不到,具体解决方法:用Qt4重写代码、用Qt3support的暂时代替。2)Qt3support的接口在Qt4中通常是调用已经实现的Qt4的接口来实现的,和Qt3的实现方式存在一些区别。因此通常会出现一些和以前程序效果不一样的地方。3)Qt在实现同一种功能的时候往往会提供多种处理方案。比如:实现QTableWidget右击菜单,可以继承下来重写contextMenuEvent虚函数,或者直接用addAction接口添加右击菜单菜单项,无需麻烦继承;处理一个QWidget对象的mousePressEvent事件的时候可以继承下来处理,也可以用QObject提供的intallEventFilter接口交个另外一个对象处理,这样也无需麻烦继承;在QMenu中添加了许多QAction,要获取QAction的响应槽函数可以对每个QAction的voidtriggered(boolchecked=flase)信号进行关联,也可以对QMenu的voidtriggered(QAction*action)信号进行关联,进行统一的处理。用不同方式实现会使得程序的结构不一样,因此可以自己选择来更好的优化代码的结构。Qt3转Qt4后有很多方式可能已经不再支持,这样要彻底转换就必须修改大量代码来改变程序的结构。Qt3转Qt4的经验总结1)转换工具:用Qt4自带的Qt3To4转换工具进行Qt3转Qt4,目前还未发现其它转换工具。2)无ui文件的project的转换,主要是一些动态或静态库的转换。对于Qt4的程序是不可以直接调Qt3的库的,如:Qt3库的某个接口的返回值为QString,那么Qt4是无法获取该变量的值,因为Qt4和Qt3在实现上内部内存分配方式是不一样的。具体转换过程如下:a)打开控制台,将目录设置到工程目录下,用qt3to4工具,具体如:qt3to4qt3dlltest.pro,提示一些文件将会转换,选择all(全部转换),将会产生一个portinglog.txt的移植日志文件,里面详细记录了所有文件被修改的情况。b)用qmake–tpvc生成VC工程,可以看到代码中多了一些注释://Addedbyqt3to4:另外在Pro文件中多了:#Thefollowinglinewasinsertedbyqt3to4QT+=qt3support等等,这些主要是转换后的程序用了很多Qt4提供的兼容Qt3的一些类、接口等等。要想不使用这些兼容的功能只能手动修改成纯Qt4的代码。c)修改其它一些错误,主要是Qt4不兼容Qt3的一些代码。3)带ui文件的project的转换:首先要说明Qt4有两种ui文件的编译器程序:uic和uic3,uic是Qt4的ui编译器,uic3是保留的Qt3的ui编译器。如果采用无ui文件的project的转换的方式,将会在pro文件中发现,如:#ThefollowinglinewaschangedfromFORMStoFORMS3byqt3to4FORMS3+=qt3test1.ui#Thefollowinglinewasinsertedbyqt3to4QT+=qt3support#Thefollowinglinewasinsertedbyqt3to4CONFIG+=uic3可以看出这种转换方式转换后的程序的界面仍然是Qt3的界面,不能满足移植的目的需求,因此要先把ui文件先转成Qt4的ui文件。具体转换方法有如下2种:a)用uic3–convertqt3test1.uiqt4test1.ui,再将转换后的ui名称改成和原来一样的。b)直接用Qt4的Designer打开文件,提示文件将会从Qt3转为Qt4,确定后直接保存该文件就可以了。Ui文件转化好后再用qt3to4工具进行转换,打开pro文件,照样可以看到:#ThefollowinglinewaschangedfromFORMStoFORMS3byqt3to4FORMS3+=qt3test1.ui#Thefollowinglinewasinsertedbyqt3to4QT+=qt3support#Thefollowinglinewasinsertedbyqt3to4CONFIG+=uic3等等,此时需手动将全部FORMS3+=改成FORMS+=,然后删除CONFIG+=uic3,这样所以ui文件就会用Qt4的uic编译器来编译了。接下来就和无ui文件的project的转换一样了。在ui文件中存在了Qt4兼容的一些窗口和控件,可以暂时用Qt3support的先代替,如需要可以手工依次转成纯Qt4的控件。2012年2月5日
本文标题:QT3和QT4的差异及代码转换方法
链接地址:https://www.777doc.com/doc-2854588 .html