红联Linux门户
Linux帮助

关于Qt

发布时间:2007-10-02 10:25:51来源:红联作者:fersuse
  一提起GUI编程,很多人马上会想起VB、VC++之类的,至多也只会想到Delphi或C++ Builder。这并非好事,证明了人们只会使用IDE进行编程,似乎一离开了IDE,就马上变得束手无策,或者认为只有编命令行程序的份了。

  事实并非如此,现在我所介绍的东西名叫Qt。Qt是什么?它不是一个集成开发环境,而只是一个完整的GUI类库。就像是VC++中的MFC,或Delphi,C++ Builder 里面的VCL。不过,VC++与MFC的耦合度太高了,脱离了VC++,编写MFC程序是一件极度困难的事情。

  Qt就只是一套类库,基于成熟的C++语言,用面向对象的思想组织。它支持多平台,有"一次编写,到处编译"的特点,编译出来的程序可以运行于Win32,Linux,Solaris 及Mac OS X之下,甚至是嵌入式系统。你可以用你最喜欢的编辑器来编写代码,再用gcc或其它编译器编译程序。另外,你可以用make和cvs来管理代码。假如你依旧中情于IDE,那也不要紧。在linux 下可选的IDE不少,如KDevelop。而我就更喜欢最近很流行的Eclipse 来管理工程。其实,Eclipse也只是在后台调用make 和qmake之类的程序而已。

  我一向认为,Borland的VCL是最优秀的GUI Framework,因为Delphi给我留下的印象太深了。如今,Qt在我心目的位置日渐提升。Qt是开源的,但却由一间技术先进的公司进行维护,代码的质量有保证。Qt对平台上的函数有完善的封装。无论是图形界面的生成,还是文件输入输出的管理,还是数据库,TCP/IP网络的应用,甚至是各种容器和算法的使用,都可以调用Qt类库完成,而无需调用平台特有的函数。另外,Qt有一套完整的文档,包括一个简单的教程,一份介绍特性的White paper,以及整个类库的详细说明。虽说其规模比不上庞大的MSDN,但对于Qt程序员,足矣。

  作为一个GUI类库,布局能力是很重要的。你看看VB,虽然我们只需要用鼠标拽几下就可以在窗口中布置几个控件,但这种布局有其局限性--因为这是种绝对位置布局。所以,当窗口被用户放大或缩小后,里面的控件依旧不会调整位置和大小。这时,你就得进行额外的处理,编写一大堆计算加加减减的代码,麻烦得很。这就是"Visual "啊。Delphi的处理方法比较特别,程序员可以设置各个控件的上下左右放大策略,也可以将控件放到各个Panel 里面以进行管理。

  Qt有自己的布局机制。虽然不能像VB和Delphi 那样可以用鼠标布局,而要用代码布局,但效果决不会差。Qt有几个管理布局的类: QHBoxLayout 可将其管理的部件组织到一个从左到右的水平行上,QVBoxLayout可将其管理的部件组织到一个从上到下的垂直列上,QGridLayout可将其管理的部件组织到一个m*n的网格单元中,部件可以占用一个网格,也可以占用多个网格。此外,我们还可以设置各种策略,告诉Qt,当窗口大小改变时,里面的子部件应该如何随之变化。可以是随比例放大,也可以不变,也可以是其它行为。当然,纯粹用代码生成界面的话,我们就要注意将界面与业务的代码分离,以保证我们的程序易于维护,代码便于复用。当然,没有人会阻止你使用鼠标拖放来布局,Qt为我们提供了一个名叫Qt Designer的软件,用法与VB、Delphi 类似,可以尝试一下。

  若从编程思想上来研究Qt,我认为它的设计还是很优良的,思路十分清晰,组织得很合理。不妨作一个比较。MFC是有名难学的。其原因并非广大程序员水平不高,而是其设计的确糟糕。虽MFC美名为"Object based framework ",但其中很多设计是不符合面向对象编程思想的。例如,里面用到了大量的宏来完成各种工作,包括消息映射,仿佛回到了C语言时代。另外,只要离开了VC++的MFC Wizard ,要写个程序极为麻烦和痛苦。而且MFC对Windows API封装并不彻底,到处可以找到底层API的痕迹,例如定义消息的宏。总而言之,就是一个乱字。Qt则大不相同,一切整整有条。大部分类都继承自QBoject,一般来说,窗口部件是 QWidget 或其子类的实例。而有框架的类就继承自QFrame。Qt中有许多类,不是用来被直接使用的,而是用来供程序员子类化来生成新组件。例如QButton,一般我们不会直接使用它,而是使用其子类QPushButton。一个窗口部件可包含任意数量的子部件。子部件在父部件的区域内显示。没有父部件的部件是顶级部件(比如一个窗口),通常在桌面环境的任务栏上有它们的入口。QT不在窗口部件上施加任何限制。任何部件都可以是顶级部件;任何部件都可以是其他部件的子部件。通过自动或手动(如果你喜欢)地使用布局管理器可以设定子部件在父部件区域中的位置。如果父部件被停用,隐藏或删除,同样的动作会递归地应用于它的所有子部件。

  目前,Linux下面有近一半的GUI程序是基于Qt的。例如被广泛使用的桌面环境(Desktop Environment)KDE就是用Qt实现的。很多出色的GUI程序,都是基于Qt,或者比Qt更高一层的KDE框架。例如音乐播放器Amarok,刻录软件K3B,Office套件KOffice等等。Linux下面另一个比较流行的Framework是Gtk,但感觉Gtk编写出来的程序在界面上过于简洁,灵活性不是很强,给人一种不成熟的感觉。但是,Qt的许可规定:Qt的开源版本不允许用来开发商业软件,,否则要付费。因此,很多商业软件,或说商业软件公司,都使用Gtk来开发自己的软件,以避免法律纠纷。例如NVidia的驱动配置程序,Realplayer for linux,Adobe Reader,VMware,其GUI界面无一不是基于Gtk的。

  现在,很多人还是只知道用VB,VC等工具开发软件,为何不尝试一下使用Qt?基本上很多人都在使用盗版的开发工具,为何不尝试有合法授权的Qt开源版?我不敢说Qt做得尽善尽美。只是许多同学经常问我,或向我提及VB6,VC++6有何好处有何优点。我觉得我们的眼光应该放开一点,冲出MS的技术包围,多接触一些新鲜的东西。遗憾的是,目前关于Qt3的编程书籍不多,一本是Linux开发大师倪继利写的,比较高深,而且着重点是嵌入式Linxu软件开发。另一本是官方推荐的书籍,英文名叫C++ GUI Programming with Qt 3,中文名叫《C++ GUI QT3编程》,不过此书感觉很一般,不大好看。反正看Qt自带的文档学到的东西更多,书籍就成为了次要的参考资料。

  总而言之,Qt值得你的尝试。
文章评论

共有 1 条评论

  1. Linux85fan 于 2007-10-03 19:17:04发表:

    QT没试过,GTK也能编出好程序,怎么把GTK说得那么差啊。不过gtk真是不怎么灵活,感觉好多代码很多余,一个小程序要用好多代码。。汗。。