著名的QT库前一阵子升级到4.xx版本了,我目前在开发的一个基于QT3的软件,由于受到QThread的各种困扰,因此打算尝试将代码升级到QT4, 但是当我实际开始升级工作后,才发现QT3和QT4的变化实在是太大了,最后导致我几乎修改了程序中的所有文件,幸好目前开发工作还只是开了个头,只修改 了40多个类,但那也足足花了我一周多时间,下面简单的说说QT3升级到QT4时的注意点:

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://tb.blog.csdn.net/TrackBack.aspx?PostId=564584

 
 
 
 
 
 
 

QT4和QT3的区别

为了即将到来的就业问题,目前正在努力学习QT。

我买了一本QT3的书《C++ GUI
QT3编程》,感觉是相当不错的一本书,不过我的系统上装的是QT4,遇到了不少麻烦。一开始以为3和4没多大区别,但是按照书上的例子去实践的时候发现
居然变化如此之大,目前看了书上的前2章,发现基本上每个例子都需要修改才能在QT4里使用,下面总结一下暂时发现的QT4和QT3的区别。

一些类和函数的变化:
1) QHBox这种类没有了,都需要改用QHBoxLayout来布局。就是先new一个QWidget出来,然后用这个Widget的setLayout方法来加入Layout。
2) QApplication的setMainWidget方法没有了,不需要手动设置主窗口部件,似乎自动就设置好了。
3) QWidget中的setCaption()方法改成了setWindowTitle()。
4) QDialog的构造函数有变化,不再有QDialog(QWidget *, const char*)这种形式的构造函数了。
5) QLineEdit类的isOn()方法改成了isChecked()。

Qt4 Designer的变化:
这个Designer的变化是非常的大,主要是取消了自定义signal/slot以及编辑代码的功能,而且如何使用Designer设计出的界面来编译程序的方法也有变化。

界面的设计和以前区别不大,添加各种Widget就行了,然后在connection编辑器中设置signal/slot,不过需要注意的是,QT4
Designer的connection编辑器不能自定义slot,需要手工编写connection,具体做法后面给出。

下面结合书上第2章的那个Go to Cell的例子来说一下如何编译程序。
首先设计界面,按照书上弄就行了,设计完了的窗体大概是这样的:

这个是运行时的样子,设计的时候需要把各个部件之间的连接都做好,然后保存起来,这时在保存的目录下会生成一个gotocelldialog.ui文件。然后在控制台下:
qmake -project
qmake
make
这里只会生成一个ui_gotocelldialog.h文件,而不会编译成功的,所以从这里开始就和qt3不太一样了。
首先,你要自己动手写gotocelldialog.h和gotocelldialog.cpp,也就是说GoToCellDialog这个类是需要自己实现的,uic不能自动生成了。
实现GoToCellDialog采用的是C++中多重继承的方式,GoToCellDialog是派生类,基类是QDialog和uic在
ui_gotocelldialog.h中自动生成的Ui::GoToCellDialog。Ui是一个namespace,在
ui_gotocelldialog最后面声明。

gotocelldialog.h代码:
#ifndef GOTOCELLDIALOG_H
#define GOTOCELLDIALOG_H

#include <qdialog.h>
#include "ui_gotocelldialog.h" //需要从这个文件里的Ui::GoToDialog

class GoToCellDialog : public QDialog, public Ui::GoToCellDialog //多重继承
{
        Q_OBJECT
public:
        GoToCellDialog(QWidget *parent = 0);
public slots:
        void enableOKButton(); //这里是自定义的slot,在Designer中无法直接定义了
};
#endif

gotocelldialog.h是GoToCellDialog类的声明,这个类是我们需要直接使用的,在这里要手动添加自定义的signal/slot。然后再写一个gotocelldialog.cpp,实现GoToCellDialog类中的各个成员函数。

gotocelldialog.cpp代码:
#include <qvalidator.h>
#include "gotocelldialog.h" //类声明的头文件,需要自己动手写

GoToCellDialog::GoToCellDialog(QWidget *parent)
        : QDialog(parent)
{
        setupUi(this); //这个非常重要,在构造函数中用这个函数来实现界面,
                    //没有这个函数的话界面就不会被显示出来

QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");
        lineEdit->setValidator(new QRegExpValidator(regExp, this));

connect(lineEdit, SIGNAL(textChanged(const QString&)),
                        this, SLOT(enableOKButton()));     //对于自定义的signal/slot,要手动加上连接

}

void GoToCellDialog::enableOKButton()
{
        okButton->setEnabled(lineEdit->hasAcceptableInput());
}

这样,在项目的目录下就会生成以下文件:
gotocelldialog.ui   //设计界面后,自动生成的xml文件
gotocelldialog.h   //手写
gotocelldialog.cpp //手写

执行qmake,make之后还会生成一个ui_gotocelldialog.h,以及GoToCell.pro的工程文件,下面编写一个main.cpp生成一个QApplication对象就可以编译执行程序了。

总结一下:

假设项目里面有一个类tc。Qt4的Designer会生成一个tc.ui文件,然后需要用户手写出tc.h和tc.cpp以实现tc类(实现这两个文件
需要根据后来生成的ui_c.h文件),在tc.h和tc.cpp中用户可以加入自定义的signali/slot的声明和实现。然后qmake
-project来生成.pro工程文件,qmake生成Makefile,最后使用make编译。make的时候会Qt会根据tc.ui生成
ui_tc.h文件,这个文件里含有tc类的基类Ui::tc,而真正的tc类则是通过多重继承实现的。
当然,如果不使用Qt Designer而是直接写代码做界面的话就没有这么麻烦,编译方法和Qt3大致相同。

另外,清理电脑风扇之后用KDE感觉非常的流畅,256MB内存基本没有卡的时候,秀一张我目前KDE的桌面,嘿嘿

QT4和QT3的区别的更多相关文章

  1. Qt4与Qt3的主要不同

    Qt4与Qt3的主要不同 1)QT4 中提供了大量新控件,虽然它也保持了旧的控件,并命名为Qt3XXX,但是这样的控件没准在今后的哪个QT版本中就不被支持了,所以还是换吧,控件替换的 工作是巨大的,这 ...

  2. QT4与QT3的不同

    1)QT4中提供了大量新控件,虽然它也保持了旧的控件,并命名为Qt3XXX,但是这样的控件没准在今后的哪个QT版本中就不被支持了,所以还是换吧,控件替换的工作是巨大的,这些新的控件使用了新的方法.属性 ...

  3. qt线程(转)----这篇很专业!

    本文档是自己所整理的一份文档,部分是原创,还转贴了网上的一此资料(已经标明了),(难点是多线程的编写),是有源代码的,大家可以作为参考,用到的知识是视频采集,压缩解压(xvid),实时传输(jrtp) ...

  4. Linux就这个范儿 第19章 团结就是力量 LSB是Linux标准化基地(Linux Standards Base)的简称

    Linux就这个范儿 第19章 团结就是力量  LSB是Linux标准化基地(Linux Standards Base)的简称 这个图片好可爱,它是LSB组织的图标.你肯定会问:“图标这么设计一定有说 ...

  5. 【Qt】Qt之自定义界面(窗体缩放)【转】

    简述 通过前两节内容,我们实现了自定义窗体的移动,以及自定义标题栏-用来显示窗体的图标.标题,以及控制窗体最小化.最大化.关闭. 在这之后,我们还缺少窗体的缩放-当鼠标移动到窗体的边框-左.上.右.下 ...

  6. Qt之自定义界面(窗体缩放)

    简述 通过前两节内容,我们实现了自定义窗体的移动,以及自定义标题栏-用来显示窗体的图标.标题,以及控制窗体最小化.最大化.关闭. 在这之后,我们还缺少窗体的缩放-当鼠标移动到窗体的边框-左.上.右.下 ...

  7. Qt的内存管理

    在QT的程序中经常会看到只有new而不delete的情况,其实是因为QT有一套回收内存的机制,主要的规则如下: 1.所有继承自QOBJECT类的类,如果在new的时候指定了父亲,那么它的清理时在父亲被 ...

  8. MFC与Qt的内存管理

    最近在做MFC向Qt的移植,在内存管理方面遇到了很头疼的问题,虽然不知道问题到底出在哪,先了解下这两个库的内存管理方式.于是转载两篇关于内存管理的文章. 一. Qt内存管理: 在Qt的程序中经常会看到 ...

  9. linux重新编译内核

    一.linux内核 1.查看linux内核版本 uname -r 2.下载对应的linux内核 https://www.kernel.org/pub/linux/kernel/ 将内核文件夹解压到/u ...

随机推荐

  1. 怎样学好C++语言

    昨天写了一篇怎样学好C语言,就有人回复问我怎样学好C++,所以,我把我个人的一些学习经验写在这里,希望对大家实用.首先,由于怎样学好C语言中谈到了算法和系统,所以这里就仅仅谈C++语言. C++是最难 ...

  2. Mac 安装配置启动Tomcat

    Tomcat Mac 下的安装: TomCat 下载地址,例如: http://tomcat.apache.org/download-70.cgi 在Mac 上下载的时候,下载tar.gz包 下载完成 ...

  3. Delphi中运行时改变panel的位置及大小(通过wm_SysCommand来实现)

    procedure TForm1.pnl1MouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Int ...

  4. Linux下使用Mysql

    一.连接MySQL数据库 一个最简单的程序示例: #include <stdio.h> #include "mysql.h" int main() { MYSQL my ...

  5. Swift - 通过url地址打开web页面

    通过UIApplication.sharedApplication().openURL()方法,可以使用浏览器打开相应的网页. 1 2 3 var urlString = "http://h ...

  6. Android 仿 窗帘效果 和 登录界面拖动效果 (Scroller类的应用) 附 2个DEMO及源码

    在android学习中,动作交互是软件中重要的一部分,其中的Scroller就是提供了拖动效果的类,在网上,比如说一些Launcher实现滑屏都可以通过这个类去实现.下面要说的就是上次Scroller ...

  7. JavaScript常用全局属性与方法

    最近,在学习JavaScript,Java作域链包含全局,记录下常用的全局属性与方法,就当是知识的积累,未列出全部,如需查看全部可参考JS相关的API文档. 常用的全局属性:  全局属性      作 ...

  8. [积累]C++复习 海大2014硕士生面试题微信系统总结

    好久没用C++了,正好同学有个面试题,于是就帮忙看了一下.尽管对C++的知识了解不少, 可是长期被Java浸淫, 发现这个简单的程序却也写着也不是那么顺手.好在最后还是搞定了,以下分析一下,题目例如以 ...

  9. 【分享】深入浅出WPF全系列教程及源码

    本人10月份提出离职,可是交接非常慢,预计年底才会交接完,趁着交接之际,自学了一下WPF,由于这是微软未来的发展趋势,自WIN7以来包含前不久公布的WIN8,核心还是WPF,在此,将自己的学习成果做一 ...

  10. Hide C# winform App Window When Started by Task Scheduler

    To make a Scheduled Task run in the background, change the User running the task to "SYSTEM&quo ...