[本人baidu博客全部搬家到csdn,baidu博客地址:http://hi.baidu.com/new/miracleconf]
跨平臺GUI開發庫
這篇內容有點專業,不搞開發的的可以飄過。
作爲一個跨平臺的GUI庫,Qt算是老前輩了(據說tk是第一個真正的跨平臺的GUI開發包,不知道有沒有人驗證過,但是用腳本寫界面,這個好像不是主流吧)。網上搜索“跨平臺GUI開發”應該可以得到不少對各個開發包進行比較的文章,這裏說說我的感受:
Qt(http://www.trolltech.com/)我最喜歡的東西,畢竟是商業的東西,沒什麼bug,文檔詳細,API接口也做得通俗易懂,對windows、Linux、MacOS的支持都堪稱完美。在MFC的世界摸爬滾打之後,發現Qt對程序員來說真是一片空氣清新的世外桃源——就是舒服。準確的說,Qt是一個完整的應用程序開發庫,而不僅僅是GUI。比如線程、數據庫、socket這些東西都有對應的封裝。第一次接觸Qt是在PDA上的Qtopia環境,Qtopia其實就是在Qt Embeded(不用Xwindows的Linux版Qt)系統中集成了很多應用軟件,打成一個包,就像Windows mobile,主要的應用程序都有了,用戶還可以再在上面裝點自己的小程序。現在Qt都出到4.4版本了,據說相對於版本3主要的改動是矢量圖形的支持,我沒有用過。Google Earth就是用的Qt,可以看到qt-mt338.dll這個dll文件,說明它用的是3.3.8版本的帶多線程支持的Qt。
Moto曾經在高端的Linux手機上都用Qtopia環境,如A600、A680什麼的,那個時候Qtopia也是唯一在嵌入式GUI領域可以商業的Linux方案,GTK on Framebuffer還不那麼穩定,後來Moto和一幫日本公司搞了那個Limo基金會,專門用GTK/Framebuffer做Linux方案。今年年初Trolltech被收購的時候,moto說Qt已經對它們不那麼重要了,我也相信這是事實。
GTK(http://www.gtk.org/)
這個現在應該是應用最廣的了,LGPL發佈。說實話,我不喜歡這個東西,從封裝和API上看沒有Qt做的好,而且做程序還必須要atk和pango的一系列依賴的包。Wireshark(原來的ethereal)就是用GTK開發的,所以移植到windows上也是用的windows版的gtk,看看Wireshark安裝目錄下的dll文件就知道gtk要依賴多少東西了。開發起來不爽。說了這麼多GTK的壞話,再說點好的,gtkmm是一個gtk的C++封裝,做的不錯,一看代碼風格也知道要現代一些,不知這個mm是什麼意思;以gtk爲基礎的gnome桌面環境現在有Sun和Redhat、Ubuntu的人的商業化支持,所以是原來穩定性越好了。不像Qt爲基礎的KDE,好像一直沒什麼商業化的支持,在桌面環境中的日漸式微就不足爲奇了,我懷疑商業公司都不是真的喜歡GPL的東西,GTK是LGPL的,商業公司很喜歡,基於GTK的軟件哪天它不想開源了也可以。Qt從QPL轉到GPL之後,也沒有多少商業的支持。這些大公司如果做了一個基礎構架,就GPL了一把,讓別人都用我的東西,提高自己的影響力,而且用了的公司還也得開源。如果是一個業務層面的軟件,大公司的產品就沒有一個是開源的。好了,扯遠了,GTK也是個不錯的東西,FireFox都用它,我從來沒有用它做過有點規模的開發還說了這麼多壞話,估計rp值有所下降。
wxWidgets(http://wxwidgets.org/)
原名叫wxwindows,這個也不錯,從API和編程風格上,模仿MFC的痕跡比較重,但是封裝的很多類比MFC更高級。作爲一個開源社區維護的產品,文檔寫的相當不錯。從MFC轉到這個上面很容易,開發社區一直比較活躍,還有一個xrc擴展可以用xml來定義界面。這個應該是跨的平臺最多的一個開發包了。不過wxwidgets的代碼質量和Qt相比應該還是有差距,我在開發中就發現了其中的兩個bug(好像那個時候還是2.4版本),但是瑕不掩瑜,總體來說wx做的相當不錯,連Apple的MacOS中默認安裝都自帶wx的運行環境,可見其影響力。另外要說的是,wx從以開始就做了很好的python綁定,叫做wxPython,和wx本身同步更新,基本上現在是python做界面開發的首選GUI庫。比如原版的BitTorrent,界面就是用wxPython寫的。儘管PyQt和PyGTK都在發展,都有人用,但是在Python的名下,風頭似乎不及wxwidgets。上面說用腳本寫界面似乎不是主流,但是在Python崛起之後,這個也不好說了。另外要說一點是:在X11上的wxwidgets有三個版本,一是直接用X庫的wxX11,一個是基於GTK的wxGTK,還有基於Motif的wxMotif(開發不太活躍)。wxGTK要穩定一些。
Fox Toolkits(http://www.fox-toolkit.org/)
說實話,沒有真正用過,好像一直也還比較活躍,畢竟能撐到現在的GUI庫都是有些實力的。
下面是我的比較:
- Qt is the best one. 穩定,一個開發包搞定所有,不好的一點是編譯很慢,相當慢,C++的通病啊。Qt Embedded應該是第一個不用Xwindow的linux圖形環境吧,贊一個。想學習Linux下的GUI開發,應該從這個入手。甚至可以在VC用Qt的插件開發,做完程序到Linux下重新編譯一下就OK了。
- GTK,API相對有點複雜,但是在內存佔用上相對而言有優勢,說道這裏再罵兩句Xwindow,一個工具欄上的Applet就要駐留10M內存,太爛了吧。GTKmm封裝的不錯。在windows下開發GTK程序沒有Qt那麼方便,搭環境就比較複雜,還是在Linux下開發吧。
- wxWidgets,移植MFC的程序到Linux下的話當然是用它了。或者你在給Python寫界面程序,那就用Ulipad,用wxPython寫的一個python集成環境。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
C++類庫介紹
再次體現了C++保持核心語言的效率同時大力發展應用庫的發展趨勢!!在C++中,庫的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了設計庫來擴充功能要好過設計更多的語法的言論。現實中,C++的庫門類繁多,解決的問題也是極其廣泛,庫從輕量級到重量級的都有。不少都是讓人眼界大開,亦或是望而生嘆的思維傑作。由於庫的數量非常龐大,而且限於筆者水平,其中很多並不瞭解。所以文中所提的一些庫都是比較著名的大型庫。
標準庫
標準庫中提供了C++程序的基本設施。雖然C++標準庫隨着C++標準折騰了許多年,直到標準的出臺才正式定型,但是在標準庫的實現上卻很令人欣慰得看到多種實現,並且已被實踐證明爲有工業級別強度的佳作。
1、 Dinkumware C++ Library
參考站點:http://www.dinkumware.com/'>http://www.dinkumware.com/
P.J. Plauger編寫的高品質的標準庫。P.J. Plauger博士是Dr. Dobb's程序設計傑出獎的獲得者。其編寫的庫長期被Microsoft採用,並且最近Borland也取得了其OEM的license,在其C/C+ +的產品中採用Dinkumware的庫。
2、 RogueWave Standard C++ Library
參考站點:http://www.roguewave.com/'>http://www.roguewave.com/'>http://www.roguewave.com/'>http://www.roguewave.com/
這個庫在Borland C++ Builder的早期版本中曾經被採用,後來被其他的庫給替換了。筆者不推薦使用。
3、SGI STL
參考站點:http://www.roguewave.com/'>http://www.roguewave.com/'>http://www.roguewave.com/'>http://www.roguewave.com/
SGI公司的C++標準模版庫。
4、STLport
參考站點:http://www.stlport.org/'>http://www.stlport.org/
SGI STL庫的跨平臺可移植版本。
準標準庫——Boost
Boost 庫是一個經過千錘百煉、可移植、提供源代碼的C++庫,作爲標準庫的後備,是C++標準化進程的發動機之一。 Boost庫由C++標準委員會庫工作組成員發起,在C++社區中影響甚大,其成員已近2000人。 Boost庫爲我們帶來了最新、最酷、最實用的技術,是不折不扣的"準"標準庫。
Boost中比較有名氣的有這麼幾個庫:
Regex
正則表達式庫
Spirit
LL parser framework,用C++代碼直接表達EBNF
Graph
圖組件和算法
Lambda
在調用的地方定義短小匿名的函數對象,很實用的functional功能
concept check
檢查泛型編程中的concept
Mpl
用模板實現的元編程框架
Thread
可移植的C++多線程庫
Python
把C++類和函數映射到Python之中
Pool
內存池管理
smart_ptr
5個智能指針,學習智能指針必讀,一份不錯的參考是來自CUJ的文章:
Smart Pointers in Boost,哦,這篇文章可以查到,CUJ是提供在線瀏覽的。中文版見筆者在《Dr. Dobb's Journal軟件研發雜誌》第7輯上的譯文。
Boost 總體來說是實用價值很高,質量很高的庫。並且由於其對跨平臺的強調,對標準C++的強調,是編寫平臺無關,現代C++的開發者必備的工具。但是Boost 中也有很多是實驗性質的東西,在實際的開發中實用需要謹慎。並且很多Boost中的庫功能堪稱對語言功能的擴展,其構造用盡精巧的手法,不要貿然的花費時間研讀。Boost另外一面,比如Graph這樣的庫則是具有工業強度,結構良好,非常值得研讀的精品代碼,並且也可以放心的在產品代碼中多多利用。
參考站點:http://www.boost.org'>http://www.boost.org(國內鏡像:http://www.c'> http://www.c'>http://www.c'>http://www.c-view.org/tech/lib/boost/index.htm)
GUI
在衆多C++的庫中,GUI部分的庫算是比較繁榮,也比較引人注目的。在實際開發中,GUI庫的選擇也是非常重要的一件事情,下面我們綜述一下可選擇的GUI庫,各自的特點以及相關工具的支持。
1、 MFC
大名鼎鼎的微軟基礎類庫(Microsoft Foundation Class)。大凡學過VC++的人都應該知道這個庫。雖然從技術角度講,MFC是不大漂亮的,但是它構建於Windows API 之上,能夠使程序員的工作更容易,編程效率高,減少了大量在建立 Windows 程序時必須編寫的代碼,同時它還提供了所有一般 C++ 編程的優點,例如繼承和封裝。MFC 編寫的程序在各個版本的Windows操作系統上是可移植的,例如,在 Windows 3.1下編寫的代碼可以很容易地移植到
Windows NT 或 Windows 95 上。但是在最近發展以及官方支持上日漸勢微。
2、 QT
參考網站:http://www.trolltech.com/'>http://www.trolltech.com/
Qt 是Trolltech公司的一個多平臺的C++圖形用戶界面應用程序框架。它提供給應用程序開發者建立藝術級的圖形用戶界面所需的所用功能。Qt是完全面向對象的很容易擴展,並且允許真正地組件編程。自從1996年早些時候,Qt進入商業領域,它已經成爲全世界範圍內數千種成功的應用程序的基礎。Qt也是流行的Linux桌面環境KDE 的基礎,同時它還支持Windows、Macintosh、Unix/X11等多種平臺。
3、WxWindows
參考網站:http://www.wxwindows.org/'>http://www.wxwindows.org/
跨平臺的GUI庫。因爲其類層次極像MFC,所以有文章介紹從MFC到WxWindows的代碼移植以實現跨平臺的功能。通過多年的開發也是一個日趨完善的 GUI庫,支持同樣不弱於前面兩個庫。並且是完全開放源代碼的。新近的C++ Builder X的GUI設計器就是基於這個庫的。
4、Fox
開放源代碼的GUI庫。作者從自己親身的開發經驗中得出了一個理想的GUI庫應該是什麼樣子的感受出發,從而開始了對這個庫的開發。有興趣的可以嘗試一下。
參考網站:http://www.fox'>http://www.fox-toolkit.org/
5、 WTL
基於ATL的一個庫。因爲使用了大量ATL的輕量級手法,模板等技術,在代碼尺寸,以及速度優化方面做得非常到位。主要面向的使用羣體是開發COM輕量級供網絡下載的可視化控件的開發者。
6、 GTK
參考網站:http://gtkmm.sourceforge.net/
GTK是一個大名鼎鼎的C的開源GUI庫。在Linux世界中有Gnome這樣的殺手應用。而GTK就是這個庫的C++封裝版本。