• 14691阅读
  • 14回复

Qt4与Qt3的主要不同 [复制链接]

上一主题 下一主题
离线buddy_zhu
 
只看楼主 倒序阅读 楼主  发表于: 2006-04-14
— 本帖被 xtfllbl 执行锁定操作(2010-06-17) —
1)QT4中提供了大量新控件,虽然它也保持了旧的控件,并命名为Qt3XXX,但是这样的控件没准在今后的哪个QT版本中就不被支持了,所以还是换吧,控件替换的工作是巨大的,这些新的控件使用了新的方法、属性、和事件名称,虽然是比以前更规范了,但是对于升级旧代码来说,则增加了大量工作。

2)既然要更新控件,那么你就需要使用QDesigner工具来重新画界面了,OK,重画只是纯体力劳动,好说。
界面画好后,使用uic来根据界面生成代码文件,QT3的uic可以自动生成.h和.cpp文件,假设你在制作一个名叫TestDialog的对话框,那么 QT3的uic生成的文件则是TestDialog.h和TestDialog.cpp,所有的界面初始化工作都在cpp文件中执行,之后程序的逻辑代码也将加入这个文件,那么对于一个已经完成逻辑功能的对话框来说,如果要修改界面布局,你就不得不重新用uic生成.h和.cpp文件,然后将其中界面相关的代码复制到你已经修改的文件中,此时决不能直接用uic直接生成到修改过的文件上,因为那样你的代码将全部被冲掉。
这一点上,QT4进步了,因为QT4中推荐的方法是,使用uic根据界面文件生成一个h文件,以前面的TestDialog为例,生成的文件叫做ui_TestDialog.h,其中会实现一个名为Ui_TestDialog的类,包含了界面所有控件的加载功能,而程序的逻辑功能依然使用TestDialog.h,和 TestDialog.cpp这两个功能,并在TestDialog.h中用多重继承的方法,从刚才的Ui_TestDialog类来继承出实际的 TestDialog类,在TestDialog的构造函数中,只需要使用Ui_TestDialog::setupUi()方法,就可以构建出整个界面,并且由于是从Ui_TestDialog继承来的,在逻辑代码中也可以方便的访问所有控件。
从这一点来说,QT4的方法是个巨大的进步,因为ui_xxx.h中不再包含任何用户自己写的代码了,此时你想更改界面布局的话,只需要用QDesigner修改界面,再用uic生成ui_xxx.h文件,直接替换原文件就可以了。
当然,QT的ui_xxx.h文件还有其它的使用方法,不一定要使用多重继承的方法,在这里我只是介绍了我认为最方便的方法。
另外,如果你所设计的界面比较复杂,需要将某部分界面独立在其它Widget中设计和写逻辑代码,那么最上层的Dialog的ui_xxx.h文件还是需要手动修改的,不过相对于QT3,这样的修改还是非常简单的。
最后要指出的是,虽然是个好设计,但是由于和QT3的巨大区别,这导致了我重写所有界面相关的代码。。。。痛苦哦。

3) QThread发生了巨大的改变,新的QThread是从QObject继承而来的,因此可以在QThread中直接使用signal/slot了,它们是线程安全的。以前的QApplication::postEvent()方法没有了,我以前实现的一整套防止线程阻塞的机制也不再需要了。不过确实是很不错进步。

4)QSocketDevice这样的底层socket连接控件没有了,QSocket也没有了,换而之的是QTcpSocket和QTcpServer,QTcpSocket即可以用异步方式调用,又可以在线程中,用同步方式等待数据到达。

5) QT的h文件不再混在一起了,而是分成Core,Gui,Network,Xml,OpenGL等等子文件夹,所有include都需要重写了,写成 “#include <QtCore/QObject>”的样子。不过相对于前面的修改来说,这些实在不足挂齿了。

主要的更改就这些了,最后总结一下,如果你的基于QT3的代码并没有遇到什么解决不了的功能,那么最好还是不要升级到QT4了,除非你很喜欢被折磨。。。

本文引自:http://blog.csdn.net/tonylk/archive/2005/12.aspx
我觉得很有用,觉得不错的要顶一下啊
[ 此贴被XChinux在2006-04-14 20:43重新编辑 ]
离线weilong122

只看该作者 1楼 发表于: 2006-04-22
顶下
不错
离线jollygrass

只看该作者 2楼 发表于: 2006-04-22
我也顶一下!!!!!!!!!!
离线ljw_725

只看该作者 3楼 发表于: 2006-05-12
顶一下
离线jollyjia

只看该作者 4楼 发表于: 2006-05-12
QT4进步了,因为QT4中推荐的方法是,使用uic根据界面文件生成一个h文件,以前面的 TestDialog为例,生成的文件叫做ui_TestDialog.h,其中会实现一个名为Ui_TestDialog的类,包含了界面所有控件的加载功能,而程序的逻辑功能依然使用TestDialog.h,和 TestDialog.cpp这两个功能,并在TestDialog.h中用多重继承的方法,从刚才的Ui_TestDialog类来继承出实际的 TestDialog类,在TestDialog的构造函数中,只需要使用Ui_TestDialog::setupUi()方法,就可以构建出整个界面,并且由于是从Ui_TestDialog继承来的,在逻辑代码中也可以方便的访问所有控件。
从这一点来说,QT4的方法是个巨大的进步,因为ui_xxx.h中不再包含任何用户自己写的代码了,此时你想更改界面布局的话,只需要用QDesigner修改界面,再用uic生成ui_xxx.h文件,直接替换原文件就可以了。

这点很好啊,
谢谢搂住的提醒啊,
我现在都手动修改这些代码才能添加slotS呢,
这是个好方法啊!!
离线菠萝
只看该作者 5楼 发表于: 2006-05-15
不同太多了,我现在要QT4的程序移到QT3;   郁闷死了
蓬山此去无多路,青鸟殷勤为探看。
离线benq
只看该作者 6楼 发表于: 2009-04-14
C++ GUI Qt3中的代码在Qt4.1.4平台下运行,怎么不行啊?
离线浪迹江湖

只看该作者 7楼 发表于: 2009-04-15
好 顶一下
离线zhshzhjhust
只看该作者 8楼 发表于: 2009-04-15
好,顶了
离线jorneyr

只看该作者 9楼 发表于: 2009-04-15
我只希望把那个取得属性值的函数如text()改成getText()这样标准的getter形式, 可是Qt4还没有改.
离线anvon
只看该作者 10楼 发表于: 2009-08-03
顶!!
离线kneken

只看该作者 11楼 发表于: 2009-08-08
区别真大!!!
离线steve710431
只看该作者 12楼 发表于: 2010-06-11
不错,学会很多
离线taiji
只看该作者 13楼 发表于: 2010-06-12
看来这3和4换代也痛苦呀!!!
离线killerls

只看该作者 14楼 发表于: 2010-06-17
楼主说的好像有点不妥:QT3的designner生成的界面,uic后可以生成3个文件,同名的。h和。cpp文件不可以更改,如果要改的话改第三个文件好像是。h扩展名的。在designne里双击界面会问你是否生成该文件,每次修改ui文件并编译后,第三个文件不会被覆盖修改。
不过那时候比较喜欢从designner生成的类继承一个,麻烦点不过想在子类里面怎么改就怎么改。
个人感觉还是QT4好用1点。嘿嘿
[ 此帖被killerls在2010-06-17 11:29重新编辑 ]