這篇文章包含了這個領域的很多開源項目的介紹,還有我多年來的心血和汗水
去年夏天的時候,我用QT做了一個小工具
後來還用QT做了流程設計器
我把程式分享給飛揚青雲之後,他甚至搞出來一套QT的皮膚來
說實在的,QT确實挺強大的,
如果你有一個項目,需要跨平台GUI開發,你又有一個C++團隊的話,
那麼做技術選型的時候,可以負責任的說,QT是不二之選
這時可能有人會提到GTK+,
我想說的是GTK+對windows平台的支撐力度實在是少的可憐
linux的版本已經到了3.16了,windows的版本才到3.0.6,整整差10個版本(我這裡說的是GTK3)
而且大部分常見的控件在windows上都沒有
來看看我在一個開源項目上踩的坑吧。
當然還有人可能提到wxWidgets,這玩意兒我沒有深入研究過
隻知道它是在原生圖形API上再做的包裝,想想windows API搞出來的視窗有多古闆,還是算了。
類似的還有iup,跟wxWidgets的原理是一樣的。
還有人直接用遊戲庫做GUI程式的,比如nimx和nanovg
nimx是基于SDL2圖形引擎搞出來的GUI架構
我在nimx上踩到兩個坑,其中一個送出pull request給作者,作者也認了
第二個坑就直接把我坑死了。
nanovg是基于OpenGL圖形引擎搞出來的GUI架構。
這個項目還是in progress狀态。
總之,這兩個項目都不能用于生産。
說到這裡不得不說輪子兄搞的gacui
(我本想說,國内輪子兄...,但貌似他也已經肉身FQ了,再提國内也不對了)
這個項目我了解的不多,隻在14年春天的時候,搭過環境,寫過hello world
前段時間學習nim語言,興緻勃勃跑到github上問作者要dll,打算用nim做個包裝
後來才知道,作者是不會提供了,好遺憾。
gacui的原理我不太清楚,隻知道有GPU加速。
當然還有基于Direcut UI發展而來的duilib
這個庫也是國内一位朋友搞出來的
據說很多大廠的用戶端都在用這個開源庫
duilib應該是受這個項目的啟發才建成的
國内很著名的一個收費UI庫UI Power也是基于這個思路搞出來的
在國内開發GUI應用程式,更多的還是給windows平台下的使用者用
如果你想最大自由度的定制你的界面,又不想讓你的程式的發型版看起來太大
那麼duilib是個不錯的選擇,但duilib文檔太少(作者自己也這麼說),你要做足這方面的準備
好在是開源的,你C++夠牛的話,也不用擔心
當然如果你希望有完善的文檔來給你提供幫助的話,
那麼你可以選擇Qt,畢竟是國外大廠商,源碼、IDE、文檔、社群都很齊全
這裡不得不提一下國内的qtcn社群,挺不錯的,裡面有不少這個領域的專家,而且都挺熱情的
但是Qt的依賴庫庫實在太多,你開發好的程式怎麼着也得有個十幾兆,才能分發給别人。
而且我相信你肯定會用到process explorer或者dependencywalker之類的工具來查找你的程式到底依賴了哪些dll
好吧,如果你足夠厲害、有一台性能超贊的電腦、有一兩個小時的時間,你可以嘗試靜态編譯QT
如果你開發的GUI程式隻給windows平台下的使用者用
那麼最最基本的三個選擇:windows api、MFC、WTL
用windows api做GUI程式,比較辛苦,因為它就是一系列的API,所有的事情都得你自己來做
MFC是一套非常龐大的類庫,他裡面包含了一系列的C++的機制,用起來非常繁瑣
WTL比MFC簡單,比windows api易用,但資料很少
你如果要走WTL這條路,那麼你一定會看《深入解析ATL》這本書(友情提醒,這本書最新版翻譯的實在太爛了)
好,再來說用混合開發技術做GUI程式
這種技術方式的主要原理就是:
你寫代碼包住浏覽器核心,
界面代碼用HTML/CSS/JS完成(這是最大的優勢,你可以用所有與之相關的庫)
所有與界面渲染相關的事情交給浏覽器核心完成,
所有與系統相關的事情你自己完成
這項技術在移動端用的挺好的,
比如說國外的:phonegap、cordova 、ionic
還有國内的:mui、appcan
ionic和phonegap都是基于cordova的,cordova是apache開源的
ionic有自己的界面庫,最早基于angular,現在也有vue的界面庫了,
phonegap是adobe投資的項目,目前貌似不怎麼流行了
如果你要做一個移動端的項目,又打算走混合開發這條路的話,
我推薦直接用cordova,還是很不錯的,非常自由!
PC端的混合開發就不那麼火了,
但有很多大廠偷偷也在用這個技術,比如:鵝廠
如果你要做PC端的混合開發,
你有三條路可以走,
封裝IE浏覽器的核心、
封裝谷歌浏覽器的核心、
封裝Webkit浏覽器的核心、
封裝firefox浏覽器的核心
如果你要選用IE浏覽器的核心,
那麼你就不可能考慮跨平台的事情了,
而且,因為你的使用者可能使用了不同的windows作業系統
是以你要做好用戶端IE浏覽器版本不一緻的準備
IE6\7\8\9\10\11...
到IE9才可以稱得上現代化的浏覽器,市面上很多前端庫,也隻相容到IE9
用IE核心來做這個事情的好處是:
你不用把浏覽器的一堆DLL,分發給你的客戶,這是其他三個方案所不能比的。
webkit和firefox真是挺尴尬的
性能表現沒有谷歌浏覽器好
平台支撐沒有IE浏覽器好
我對firefox浏覽器的Gecko核心幾乎沒有什麼研究
(之前做浏覽器插件的時候看過他的API,現在幾乎都忘記了)
Qt在去年之前還隻有對webkit的封裝
我曾經在前年,把webkit和extjs整合起來,做了一個庫,
大家可以研究一下,但請不要用于生産,我已經不再維護這個庫了
國外也有人用.net封裝過webkit,但作者在10年左右,就不再維護這個項目了
終于說到谷歌浏覽器的核心:chromium
我實在是不建議直接研究它
你可以看看CEF這個項目
這個項目是用C++對chromium做的包裝
之前不支援中文輸入法的光标跟随,現在也已經被fix掉了
如果你是C#開發人員,也想用CEF的話,
那麼你可以考慮使用cefglue、cefsharp、chromiumfx
這三個項目我都用過,目前的狀況來看,我推薦最後一個
我曾經寫過一系列的文章來介紹這個東西
你如果是一個JS開發人員的話,
有我nodejs的庇佑,你完全不用care CEF這種東西
你可以直接選用nw.js或者electron,
這兩個東西,我也都用過,
electron區分主程序和渲染程序,兩個程序間通信要互相傳遞消息,兩個不同渲染程序間通信也要經主程序中轉,它最大的優點就是生态非常好;
nwjs就沒有electron通信上的複雜度;你可以直接在浏覽器DOM裡通路nodejs提供給你的一切,但它的生态相對來說差很多;
這兩個東西,由于都打包了Chromium和nodejs在裡面,是以安裝包都非常大,要六七十兆;
國内有一個朋友做了miniblink,号稱全球最小的Chromium開發包(不知道有沒有違反現行的廣告法,哈哈)
分免費版和收費版兩個版本,應該還不錯的,不過我還沒有試用過!
與此類似,還有一個非常厲害,但很不知名的項目,叫sciter,
像諾頓、360殺毒、賽門鐵克、遨遊浏覽器,都是用它做的;
它非常小!非常快!有自己的腳本語言(類似JS),有些HTML,CSS的特性是不支援的
它沒有綁定nodejs,預設是用C++做邏輯的,不過你還可以選go,rust,C#或者python做,但這些綁定包都是社群提供的,穩定性不明!
還想再多說一些,但忽然發現,篇幅已經太長了,借曹雪芹的一首詩止筆:
滿紙荒唐言!一把辛酸淚!一把辛酸淚!一把辛酸淚!.......