依賴C++的情況下該如何選擇做GUI界面的框架?
我平常使用的語言以C++為主,經常用到圖形圖像處理的幾個庫如opencv,opengl,kinect2.0sdk。現在想開發一下客戶端界面,最近了解了一下,有C++的MFC和QT,C#的winform和wpf,mfc和wpf一個太老,一個學起來麻煩所以先暫不談。QT和winform,在我目前看來,qt聽說開發出來的程序需要打包?程序很大? winform試著寫了一個簡單的,發現編譯之後的exe文件就能直接在安有.net framework的機器上運行,更加方便。 還有最重要一點是,我所用的幾個庫,如果在c++下我應該可以直接操作就行,在C#下能否做到與上述庫的良好溝通?
果斷qt。理由:第一,qt框架設計優雅完美,易學易用。第二,qt的幫助文檔系統十分完善,對用戶十分友好,易檢索易查找,很容易查找到你需要的信息。
第三,你既然說了要依賴c++的話,Qt是一個純粹的c++的框架。
第四,用戶很多,相關的教程包括中文版的也有不少,社區支持也比較不錯,這意味著你遇到問題了之後在網上可以很容易找到相關信息。ocornut/imgui
推薦上面這個框架,用C++實現(輕度C++應用,實際上它的實現更偏C一些,或者說是用到一點C++好處的C庫更恰當)並開源,imgui一旦你了解了它的原理就是非常容易使用的,庫很小,但功能很強大,比Qt輕量的太多(當然也少了很多東西,但是那些東西不是每個項目都需要的),不但是跨平台的,而且也是跨渲染引擎的,支持(DirectX9, DirectX10, DirectX11, OpenGL2/3, Vulkan, Allegro 5, SDL+GL2/3, iOS and Marmalade),或者其他渲染平台(甚至未來的渲染平台也能支持,因為它的渲染部分很簡單,所以容易移植)。
Screenshots Part 1 #123
Screenshots Part 2 #539
Screenshots Part 3 #772
Screenshots Part 4 #973
Screenshots Part 5 #1269
這些是用imgui做的一些項目的截圖,有沒有很炫?
imgui 可以說是天生為了實現OpenGL或D3D這些3維圖形引擎的GUI而誕生的,所以你需要有這些圖形API的一些基礎知識。
對了,它支持中文,顯示和輸入都沒有問題,在windows/mac/linux上都一樣。
果斷qt,人生苦短,別跟自己過不去,不就浪費幾個M的硬碟空間嗎,比你的時間便宜多了
一直用qt,又不差這幾十M。。。
如果只面向 Windows 平台的話,WinForm 是一個中規中矩的選擇。
選用 C# 的話,唯一的問題就看你所用的 C++ SDK 有沒有相應的易用的 C# bindings。
如果沒有的話:
- 如果純 C 介面,而且介面數量也不多,考慮手動 P/Invoke 即可。
- 如果介面很多,而且還存在 C++ 類,手擼 P/Invoke 不啻一個大工程。此時可以考慮用 swig/swig、mono/CppSharp 之類的工具自動生成相關的 bindings。
不過,像 OpenCV、OpenGL 這樣的庫,應該已經有玩家給它們做過 binding 了。例如:
OpenCV -&> OpenCV in .NET (C#, VB, C++ and more)
OpenGL -&> dwmkerr/sharpgl、Using OpenGl with C#?
-
方案很多,如果沒什麼特殊愛好,感覺優先選擇Qt,成熟,性能好,開發效率很高,實用,代碼直觀,文檔很全,社區也有很完善的回答,還可以很容易跨平台,界面好看。所以我的桌面應用一直用Qt來寫。也試過QWebEngine + JavaScript這種Hybrid App把界面做的更好看一些,功能依然強大(原諒我不會QML也不想學)。
不過最近在學C#,所以我覺得以後我會試著C++配合C#來寫。目前看來這兩門語言交互還是比較容易的,不過暫時對C#不太熟,不過很喜歡這門語言。
另外你說的這幾個庫OpenCV我知道有C# binding,其他的不太清楚。
對於託管和非託管語言的混合,可以適當調整軟體架構來繞過一些限制,例如通過命令模式將功能模塊和界面模塊解耦分別開發之類。
毛遂自薦:Rose,一個用於開發人工智慧app的跨平台工具鏈。
特色
- 同時支持開發傳統app(包括遊戲和非遊戲)、機器人app。
- 一份代碼,PC、手機、Pad、機器人,跨平台運行
- 內置Webrtc、OpenCV、TensorFlow,整個工具鏈不超過500M
- 「零」依賴,Window只需Visual Stuido,iOS只需Xcode,Android只需NDK + Android Studio
- 開發時間主要花在Windows,編寫、調試基本是在用Visual Studio
- 獨創工作包、App包機制,結構清晰,易升級
- 同步提供幫助文檔:《Rose編程指南》
工具鏈、人工智慧
Rose有狹義、廣義之分。狹義Rose指圖中那個位於中心的模塊,它實現了窗口系統、場景和動畫,以及使用其它開源庫的融合劑代碼。廣義Rose則包括了圖中的其它項目,是多個開發包組成的工具鏈。從Github下載的是廣義Rose,也就是說,只要下載它就已包含Webrtc、OpenCV、TensorFlow等源碼,不必再去官網下載了。註:圖中沒內置的只有標了紅色的Chromium。
在人工智慧方面,Rose已內置了OpenCV、TensorFlow,提供了在設備端開發人工智慧app的解決方案。AI Amart(AI Smart),一個基於Rose寫的app,可演示識別物體、行人檢測。
回到提問中涉及到的opencv、opengl,kinect2.0 sdk。Rose已內置opencv,下載它就可隨意在app調用opencv了,像先用它執行分割,緊接TensorFlow進行識別。對opengl,SDL在渲染時已在使用硬體加速,當然它是跟據平台自動使用相關技術,像Windows用DirectX(也支持用OpenGL),iOS、Android用OpenGL ES。kinect2.0則須要開發者自個加了。
你的庫充分使用了C++的高級功能的話,你就得用C++/CLI來橋接到C#上去,否則在C#裡面用P/Invoke重新把頭文件抄一遍就好了。
可選擇的解決方案很多,除了MFC外,這裡再介紹3種:
- QT:這個不多講,本身就是一個C++的框架,學習成本低、參考資料多、簡單易用、開發效率高,做界面也比較漂亮。至於你說程序大的問題,除非有特殊需求,否則我想也不在乎那麼點存儲空間吧;
- P/Invoke:選擇.net框架,界面利用WinForm或者WPF等來實現,關鍵在於寫好C++與C#之間數據交互的介面,這裡面有一些小技巧:C#調用Win32 C++動態鏈接庫那些事,當然也可以用一些類似於SWIG的自動化工具來生成。另外,你提到的opencv等幾個庫好像已經有人做了.net方面的封裝,你直接調用就行了。至於說需要安裝.net framework的問題,現在的Windows系統都是自帶的,如果是XP這種比較老的系統,只要做好程序打包發布,用戶在安裝你寫的軟體時,會自動安裝.net framwork支撐環境,甚至你還可以利用Spoon Studio這樣的工具來把.net環境和exe程序打包融合在一起(當然不推薦這麼做),所以這都不是事;
- 其他一些C++ UI庫:如果你願意的話,還可以選擇一些C++ UI庫,比如DuiLib、Bolt等,這些庫有些是開源的,有些是商業的,但是都需要一些學習成本,並且相關的參考資料相對也比較少。這裡可以給你推薦一個我這幾年一直在觀察的庫:炫彩界面庫 ,可以了解下,有技術論壇,有交流群,學習資料比較多,但是我覺得在成熟系統開發上使用還是需要慎重一點,畢竟這個庫還處在發展階段。
【個人意見,僅供參考】
必須Qt啊!
用了Qt,才知道什麼叫做優美的C++啊!
用了Qt,看C++代碼眼也不花了,頭也不疼了,連智商好像都提高了!
什麼?需要可以直接用C++操作?Qt就是原味兒的C++寫的,你說呢…
Qt需要打包?是的,但是不需要你手動打包啊!人家自帶的有自動打包工具啊!在Qt文檔中搜索「deployment」,按照文檔操作一下,就會了啊!其實就是一個命令,僅僅一個!
命令執行完後,所有依賴的Qt資源和動態庫,人家就給你放到一個文件夾里了啊!當然最後你還需要自己加上C++運行庫和你自己使用的第三方庫…
什麼?還需要製作成安裝包?那還不簡單,windows系統就用 inno setup增強版!自己搜索一下就懂了…
什麼?還想要跨平台?想編譯mac版本的?把源碼拷貝到mac里編譯一下!直接就是.app包!還需要把依賴的Qt資源和動態庫放進去?這還需要教嗎,在Qt文檔中搜索「deployment」…
什麼?mac版的還要製作成dmg?還要製作成pkg?兩個工具,dmgcanvas和package,自己搜索吧,都是可視化的傻瓜式製作工具…
什麼?Qt庫十幾M有點占空間?是生命重要還是這一點點磁碟空間重要…「mfc和wpf一個太老,一個學起來麻煩所以先暫不談」
——哪個太老,哪個學起來太麻煩????喵喵喵????可以考慮分別跑c++和ui程序,一個保持原先的邏輯,只是負責把數據發給ui程序繪圖,ui程序只負責接收命令和數據繪圖就是了
系統弱相關的可以考慮nwjs或者electron寫系統強相關的還是qt吧,cpp不推薦除qt外任何界面庫
人生苦短,你需要qt
windows的可以看看soui或者mpf,兩者目前都開源了,都是很不錯的dui框架
Qt需要打包是因為windows不自帶Qt庫啊,如果帶了Qt庫不就是應用程序的大小?你Windows系統還在乎什麼幾十M?連嵌入式那麼在乎內存的地方都在用Qt。
如果你實在覺得包太大,兩種方法,一種是裁剪動態庫,把不需要的都去掉。另一種是編譯靜態庫程序。
MFC 老,但是不是沒更新。如果界面不複雜的話,MFC足可以。
如果界面複雜,窗口關係不複雜的話,肯定是QT。
我其實想推薦C++ Builder,奈何它自己不爭氣
可以直接c++cli,託管和非託管混合編程,或者用swig轉c#,或者上qt,但是個人覺得qt不如winform方便
qt如果用vc編譯器編譯的只需要把三四個依賴的動態鏈接庫放在同一個文件夾或者動態鏈接庫放在path里某個路徑下就可以運行。
可以試試(半死不活的)C++/CLI。。相比c#可以大幅減少蛋疼的p/invoke,當然語法方面和c++還是有一些差別的。。特別是混著用的時候。。。但至少比c#抄頭文件要方便點。。。
其實很多情況下mfc就夠用,尤其是在ide用visual studio的情況下,學習曲線會比較平滑。
推薦閱讀:
※C語言和C++ C#的區別在什麼地方?
※如何評價 Christopher Kohlhoff 實驗性的 C++ Network 標準庫 ?
※C++ 怎麼生成 4096 個函數?
※C 與 C++ 的真正區別在哪裡?
※如何評價 Visual C++ 將整合 Clang 用於開發 Windows 程序?