Qt是一個著名的C++庫——或許并不能說這隻是一個GUI庫,因為Qt十分龐大,并不僅僅是GUI。使用Qt,在一定程式上你獲得的是一個“一站式”的服務:不再需要研究STL,不再需要C++的<string>,因為Qt有它自己的QString等等。或許這樣說很偏激,但Qt确實是一個“偉大的C++庫”。
我們所使用的Qt,确切地說也就是它的GUI程式設計部分。C++的GUI程式設計同Java不同:GUI并不是C++标準的一部分。是以,如果使用Java,那麼你最好的選擇就是AWT/Swing,或者也可以使SWT/JFace,但是,C++的GUI程式設計給了你更多的選擇:wxWidget, gtk++以及Qt。這幾個庫我都有接觸,但是接觸都不是很多,隻能靠一些資料和自己的一點粗淺的認識說一下它們之間的差別(PS: 更詳盡的比較在前面的文章中有)。
首先說wxWidget,這是一個标準的C++庫,和Qt一樣龐大。它的文法看上去和MFC類似,有大量的宏。據說,一個MFC程式員可以很容易的轉換到wxWidget上面來。wxWidget有一個很大的優點,就是它的界面都是原生風格的。這是其他的庫所不能做到的。wxWidget的運作效率很高,據說在Windows平台上比起微軟自家的MFC也不相上下。
gtk++其實是一個C庫,不過由于C++和C之間的關系,這點并沒有很大的關系。但是,gtk++是一個使用C語言很優雅的實作了面向對象程式設計的範例。不過,這也同樣帶來了一個問題——它的裡面帶有大量的類型轉換的宏來模拟多态,并且它的函數名“又臭又長(不過這點我倒是覺得無所謂,因為它的函數名雖然很長,但是同樣很清晰)”,使用下劃線分割單詞,看上去和Linux如出一轍。由于它是C語言實作,是以它的運作效率當然不在話下。gtk++并不是模拟的原生界面,而有它自己的風格,是以有時候就會和作業系統的界面顯得格格不入。
再來看Qt,和wxWidget一樣,它也是一個标準的C++庫。但是它的文法很類似于Java的Swing,十厘清晰,而且SIGNAL/SLOT機制使得程式看起來很明白——這也是我首先選擇Qt的一個很重要的方面,因為我是學Java出身的 :) 。不過,所謂“成也蕭何,敗也蕭何”,這種機制雖然很清楚,但是它所帶來的後果是你需要使用Qt的qmake對程式進行預處理,才能夠再使用make或者nmake進行編譯。并且它的界面也不是原生風格的,盡管Qt使用style機制十分巧妙的模拟了本地界面。另外值得一提的是,Qt不僅僅運作在桌面環境中,Qt已經被Nokia收購,它現在已經會成為Symbian系列的主要界面技術——Qt是能夠運作于嵌入式平台的。
以往人們對Qt的授權多有诟病。因為Qt的商業版本價格不菲,開源版本使用的是GPL協定。但是現在Qt的開源協定已經變成LGPL。這意味着,你可以将Qt作為一個庫連接配接到一個閉源軟體裡面。可以說,現在的Qt協定的争議已經不存在了——因為wxWidgets或者gtk+同樣使用的是類似的協定釋出的。
在本系列文章中,我們将使用Qt4進行C++ GUI的開發。我是參照着《C++ GUI Programming with Qt4》一書進行學習的。其實,我也隻是初學Qt4,在這裡将這個學習筆記記下來,希望能夠友善更多的朋友學習Qt4。我是一個Java程式員,感覺Qt4的一些命名規範以及限制同Java有異曲同工之妙,因而從Java遷移到Qt4似乎困難不大。不過,這也主要是因為Qt4良好的設計等等。
閑話少說,還是盡快開始下面的學習吧!