跨平台的GUI Framework : Qt

来源:互联网 发布:ubuntu teamview 编辑:程序博客网 时间:2024/04/27 15:17

跨平台是程序设计师长久的梦想,谁都想要程序只写一次,就能在各种平台执行,Java当初就是以『Write once, run every where.』打响知名度,因此号称是终极程序语言,也吸引了很多人头向Java阵营。Java以语言角度算是不错的语言,语法干净简洁,OO支持也算完 整,Framework设计的也不错,写出来的程序语法也蛮漂亮的,还Open Source,且支持应用很广,从GUI、Component、Web、Embedded都有支持,但Java技术最大的致命伤就是执行速度缓慢,透过 Virtual Machine技术使得Java得以实现跨平台,什么是Virtual Machine呢?简单的说,就是在给个OS上在装一个JavaOS跑Java程序,这种方式就像你写了一个Windows程序,然后也宣称是跨平台,只 要User在Linux或Mac装上VMWare,然后在VMWare下灌Windows XP,这样也能在Linux、Mac下执行你的Windows程序,但经验告诉我们,用VMWare跑其它OS,速度大约只剩下6成左右而已,Java程 序速度慢的原因就在这里,这是Virtual Machine的宿命。


C/C++的哲学就不一样了,C/C++强调的是『Write once, compile every where.』,同一份程序代码,只要在该平台重新Compile成该平台的执行档,就能在该平台执行,若文字模式下的程序,的确可以跨平台,程序完全不 需修改,但GUI盛行以后,由于各GUI的Library都不一样且没有标准,所以GUI程序并没办法跨平台Compile,因为各平台都有专属的 Library。但是C/C++优势就是执行速度快,若能解决GUI Library的问题,则跨平台即可解决。


除了GUI Library需要统一外,还得看该Library设计的好不好才行,Linux GUI我没写过就不说了,若在Windows平台,Borland的C++ Builder使用Delphi的VCL Library,Microsoft的Visual C++可以用MFC和.NET Framework,首先来看Borland的C++ Builder,它使用标准的ANSI C++语言开发,利用VCL写出来的程序也算蛮漂亮的,执行速度很快,比较麻烦的是C++ Builder当初为了缩短上市时间,并没有设计自己的Library,而是藉用Delphi的Library,导致C++ Builder在Compile时,是先用Delphi的Compiler将VCL compile成object file后,再用C++ Builder将你写的C++程序compile成object file,最后再用Linker将所有的object file link起来,由于这都是IDE在做,对程序设计师似乎影响不大,但VCL由于是Delphi的Library,所以若想深入研究VCL的source code时,则必须学Delphi的Pascal才行,否则看不懂VCL source code,这也是很多人对C++ Builder却步的原因。


再来看Microsoft的Visual C++,MFC用的是完整的ANSI C++语言,所以语言部分不是问题,但若你看过用MFC写的程序,你一定会惊讶为什么这么复杂,程序代码非常冗长不好看,且MFC是有名的喃学,若 Visual C++搭配.NET Framrwork,则无法使用ANSI C++,得用其.NET平台版本的C++/CLI,相信这点很多人就有意见了,不过.NET Framework由于设计的不错,所以写出来的程序相当精简漂亮,感觉和C++ Builder差不多,不过无论是C++ Builder或Visual C++开发的GUI,所开发出来的程序都无法跨平台,当然也无法跨平台Compile。


之前曾在博客员的C++ Blog看到有人在讨论Qt,一个跨平台GUI的Framework,当初我以为只是另外一个走Virtual Machine技术的产物,只不过使用C/C++为语言而已,所以当时也没特别注意,今天下课到天珑书局逛逛,看到有Qt的原文书,就顺手翻了一下,我才 发现跟我原本想象的完全不一样。


Qt拥有一个单一的Library,让你开发各种不同平台的程序,目前支持Windows、Linux、Mac、UNIX、 Embedded Linux,讲白话点,就是它提供了一个Library让你开发GUI程序,写好之后,只要在各平台重新Compile后,就可以在各平台执行,而且使用 完整的ANSI C++语言,且不限Compiler,只要是C++的Compiler都可以,重要的是,该Library相当漂亮,写出来的程序很像C++ Builder或.NET Framework的那样精简,不会向MFC那样复杂。目前Qt已经到第四个版本,GUI部分算支持的相当完整,且支持数据库、XML、Multi- Thread、Socket等方面的programming,看到这些特色,我毫不犹豫就买了一本讨论Qt的书来研究了,这几乎是我多年来的理想,若以 OO角度来说,无论后端是什么数据库,只要透过相同的Interface,不同数据库的Class来实做这个Interface,前端GUI的程序写法完 全不用改变,同理,面对不同的OS,理论上只要透过相同的Interface,不同OS的Class各自实做这个Interface,前端GUI的程序也 完全不用改变,最后只要靠Compiler将程序compile成各平台的原生程序即可,这样即可保证其执行速度,不用再靠Virtual Machine。但很可惜这个理想,这么多年来都没人可以做出来,或许是我孤陋寡闻吧,书上说Qt 3曾在2002年得过Jolt的Productivity Award,Jolt是相当有名的奖,能只写一次程序就能跨平台,且保证其执行速度,当然会大大提升Productivity了,我最近会玩一下Qt,看 看Qt是否适合开发大型应用程序,假如Qt适合的话,Qt无疑才是GUI终极解决方案,有强力的ANSI C/C++语言背书,又有单一的GUI Library,且精简漂亮,又能Compile成各平台的原生执行档,几乎是最完美的解决方案了,剩下只是看其好用不好用而已。C/C++技术还有什么 遗憾吗?就是Web,目前还没看到C/C++可以开发Web Application的技术,Microsoft也宣称短期之内不会让ASP.NET支持C++/CLI,若以技术而言,GUI的Library绝对比 Web的Library难度高,因为得面对各平台API的实做,而Web只要吐出HTML即可,不过既然Qt对最难的GUI都能解决了,相信C/C++在 Web有统一的Library应该也是指日可待了。

 
原创粉丝点击