web程序員應該如何學習C++?

同類問題:C++ 程序員如何成為一個web開發者?

我是一個4年經驗的PHP程序員,目前使用的是laravel這種抽象程度非常高的PHP框架。追求快速開發。

之前有用過易語言,深度到Api Hook、進程注入、IOCP、GDI繪製界面、實現過內存池、線程池、哈希表、HttpServer。

後來轉型WEB開發,從html5開發app,學到寫JQuery插件、發現ThinkPHP的抽象層次不夠、換了Laravel這種抽象層次高框架。

學C++的目的是為了寫一些日常小工具,控制台程序和GUI都需要吧。Socket和Http之類的應用層協議最好也能拿來就用的。C#是個很好的選擇,和Laravel的抽象程度相當。但是因為它的GUI不能跨平台、不能很好的接觸數據結構所以沒有選用。

目前裝了VS2015,試了試openFrameworks這樣的C++跨平台快速開發框架。但是感覺不太順手。例如它的網路庫,沒有像C#那樣提供解析uri、 query string的方法; 它的TCP Client,connect步驟竟然隱式包含在setUp[1]方法裡面。說明它抽象得不夠好。如果要用來快速開發應用、還是要做一些輪子的工作。

請問,我這樣一個程序員,現在想學C++來做一些小工具,什麼樣的路線比較順暢呢?

[1]: ofxTCPClient


謝邀,題主的需求如下:

  • 控制台、GUI都能做
  • 高抽象
  • 跨平台
  • 有Socket和Http庫
  • 可以解析uri、query string

那我推薦一個很完美的C++跨平台框架——Qt

Qt的背景介紹,可以看這裡qt_百度百科

我就簡單說下題主幾個需求在這個框架里的實現吧

1、高抽象

Qt的抽象做的非常完美,各種設計模式在不經意間很自然地應用其間,整個體系架構和組件分離非常清晰,API設計優雅,具備完善程度堪比MSDN的官方文檔。

Qt自帶了近千個Demo,涵蓋了幾乎所有功能。同時,官方也提供了大量的視頻教程,不過得翻牆上油管看。

2、開源

Qt全部源碼開源,基於LGPLv3協議,同時提供商業協議

3、GUI

Qt有兩套GUI系統。

一套是傳統的基於Widgets的GUI,是目前幾乎最強大的c++ widgets體系的gui框架(暫時已經沒有對手,如果有就是C#的WPF,但C#的性能和C++比么。。。),對界面動畫有狀態機和動畫機制實現,對複雜數據呈現有Model-View-Delegate體系,對高性能繪製提供了直接操作OpenGL的API,甚至還有圖表、數據可視化等現代化數據展示組件。

Qt Widgets框架基於類似XAML的模式描述界面,可使用所見即所得的界面編輯器實現界面。但同樣也可手寫代碼生成界面,並提供將界面描述文件在運行時載入解析為GUI的介面。

另一套是現在Qt主推的界面開發模式,Qt Quick,使用基於CSS和JS定義的QML腳本語言編寫。相比默認使用CPU渲染的Qt Widgets,Qt Quick使用GPU渲染,性能更高。而開發的效率和界面的靈活度方面,身為web程序員的題主應該能夠有所體會——QML是在用web的方式寫GUI。

對了,QML支持hiDPI。

界面調試上,Qt Creator這個IDE集成了Profile工具,可以像用瀏覽器開發者模式一樣調試分析QML程序的運作。

關於Qt Quick與html5體系的對比,可參見這個題目HTML5與Qt QML僅從做UI的角度比較,哪個更便捷,哪個更強大,哪個(被渲染)性能更高呢?

QML做的東西有多漂亮么,這個答案里有幾個案例,還僅至

只是個人開發的練手之作有哪些顏值高的 PyQt/Qt 應用? - Python

4、跨平台

Qt是完美的跨平台類庫,理論上用Qt + c++11寫的代碼,可以無需修改處處編譯。

Qt支持的平台,目前最新版本支持如下平台:

Windows

Linux/X11

OS X

Embedded Linux

QNX

Windows Phone

Windows Runtime

iOS

Android

vxWorks……

實時操作系統方面,Qt是很流行的嵌入式c++應用開發框架

主流操作系統方面,Qt幾乎全功能可以在windows、*nix、IOS、Android上運行

沒錯,Qt代碼可以直接部署到IOS和Android和WP。目前暫不支持Win10的UWP,但相信增加這個支持也不需要太久

編譯工具鏈方面,Qt支持make和cmake,以及vs的nmake,可以完美適配gcc msvc icc clang等主流c++編譯器,自帶功能完備(包括clang靜態分析和valgrind內存檢查)的IDE

Qt有Python版!

Qt有Python版!

Qt有Python版!

重要的事情說三遍。Qt是Python上最流行的GUI框架,沒有之一(當然不包括web ui)

5、成熟的應用

應用有多廣泛,有多少牛x的案例呢……

大型商業化合作夥伴,可以直接查看Qt官網Qt | Cross-platform software development for embedded desktop

Qt的成熟案例,可以看下面兩個傳送門:

有什麼很好的軟體是用 Qt 編寫的? - C++ (Autodesk、Opera、Maya、極品飛車、VirtualBox、GoogleEarth、Doxygen、Mathematica、Skype、Xconfig、WPS、YY語音……)

Qt 為什麼在桌面應用(Windows 平台)中不流行呢? - Nebula.Trek 的回答 (大型3d,vr,管理軟體和器械嵌入軟體、宇航、軍事系統……)

6、豐富的類庫

太多了,這個是Qt的優點也是槽點。優點在於,Qt類庫豐富到堪比Boost甚至比Boost更萬能,從界面到後台,從pc到移動,從exe到app到web無所不能。缺點在於,太龐大。幾十個dll,小的兩三兆,大的一二十兆。

不過還好,因為是開源,並且Qt的開源工程里支持了超級豐富的配置,可以精細到以類為單位進行裁剪,並靜態編譯,如 @姚冬 參與開發的YY語音,裁剪後的依賴庫加起來貌似就20M。

對於Qt過於龐大的問題,官方啟動了Qt Lite Project:Introducing the Qt Lite project 目標是Qt for any platform, anything, any size

我簡單列舉下Qt的組件列表吧

Qt Core

核心組件,提供信號槽機制(支持同步/非同步的,多對多,發送接收方互相無需可見的,線程安全且類型安全的消息機制,其中同步發送時性能與直接調用幾無差別)、事件循環、基於對象樹的內存自動管理、線程、線程池RunnableLocale處理、正則表達式Codec、內部統一Unicode的字元串、性能和API堪比STL的QTL容器(可和STL演算法庫完美適配)、狀態機、互斥鎖、原子操作、信號量、智能指針、file、fileSystem、tempFile、tempDir、文本流、二進位流(DataStream,可用做數據持久化)、gzip壓縮解壓、base64編碼轉換、各類hash演算法、GUID處理、IODevice(一切基於管道的IO組件介面,包括字元串流操作)、插件機制、本地化……

QTL提供Qt風格、STL風格、Java風格的介面,性能和STL的對比分析見我這個回答:Qt的容器庫對比C++的STL?

在信號槽機制支撐下,Qt多線程編程可以實現全程無鎖

Qt Gui

GUI的基礎支撐組件,包括Accessible、bitmap、pixmap、顏色處理、游標、拖放、界面事件、OpenGL介面、圖標處理、圖片處理(可通過插件方式擴展支持的圖片格式)、動態圖片、paintEngine渲染器、painter繪製器、transform圖像變換、字體渲染、文本渲染(從Document到Frame到Line到Char,包括cursor和format)、觸屏支持、矩陣計算、向量計算……

Qt Widgets

GUI控制項庫,包括窗口、MDI子窗口、dock控制項、各類layout、各種widget/frame/label/button/SpinBox/GroupBox/CheckBox/LineEdit/TextEdit(富文本)/PlainTextEdit/ScrollArea/Table/Tree/List/Menu/Action/Slider/Tab/Calender/Dialog等

界面風格可設置,默認使用系統風格,可自行編輯主題,有palette界面調色板,甚至能用類css語法寫stylesheet

功能組件豐富,包括fontdialog fonrcombobox filedialog colordialog等等等等……

能接入mac os的ns系控制項

能接入windows系的ActiveX .COM控制項

能獲取到控制項對應的系統本地handle,以和系統本身的gui介面對接

這還只是基礎控制項庫。更高級的控制項,通過其他類庫方式接入

Qt Quick

Qt Quick Control

Qt Quick Dialogs

Qt Quick Layouts

Qt Qml

Qt Quick Extras

Qt Quick Widgets

這幾個都是Qt Quick框架的組件,作為沒寫過web的程序員,我是真弄不清……

Qt XML

XML解析,支持dom模式和stream模式

Qt XmlPatterns

XML高級應用,如XPath, XQuery, XSLT 和 XML schema校驗……

Qt Network

網路庫,封裝層級極高,不適合高並發服務端編程。具備tcp、udp、http、ssl、localSocket……

Qt WebView

基於Chromium的WebView控制項庫

Qt Script

Qt Script Tools

ECMA6腳本引擎。對,你沒看錯。

Qt Multimedia

多媒體庫,包含多媒體處理、編碼、解碼,包括音頻、視頻、攝像,支持通過插件方式擴展格式

Qt Multimedia Widgets

多媒體的Widgets和QML控制項

Qt Sql

基於SQL語法的關係型資料庫類庫,可通過插件擴展支持資料庫。默認提供DB2、IBASE、MYSQL、OCI、ODBC、PSQL、SQLITE、TDS

提供基於Model-View-Delegate的Model和Delegate,可直接將一張表格或一個query關聯到一個Table控制項中,同步界面各種操作,輕鬆實現資料庫瀏覽/編輯器……

Qt Test

單元測試框架。沒錯,數據驅動、線程安全、類型安全、帶benchmark的單元測試……

每組test case就寫一個類,裡面寫多個test函數,每個函數是一個test case,函數內部只需要正常寫調用,加上三五個宏接入用例數據,然後直接編譯運行就行

支持通過spy方式,hook到信號槽過程中,監聽信號槽運行

支持模擬滑鼠、鍵盤、觸摸事件

支持benchmark,可統計任意代碼段的精確執行時間,包括系統時間、用戶時間、CPU時間等,時間單位可以是毫秒納秒微秒這類,也可以是cpu時鐘周期

Qt Bluetooth

Qt Location

Qt Positioning

Qt Nfc

Qt Sensor

這幾個不用多解釋了吧……為移動開發設計,包括藍牙、定位、nfc、感測器,具備後台類、widget控制項、qml控制項

Qt Purchase

沒錯,支付組件……

Active Qt

對Windows的ActiveX和.COM的接入

Qt 3D

基於OpenGL的簡單的3D引擎,支持Widgets和QML,並且是准實時的……

Enginio

BaaS雲服務接入……是Qt官方提供的雲服務

Qt Android Extras

安卓API接入

Qt Canvas 3D

可以用JS在QML中,以類似寫OpenGL程序一樣的方式寫3D……

Qt Concurrent

並行開發組件。沒做,你沒看錯,並行開發。

包含Map-Reduce和Future,都是寫好演算法函數後,一行代碼完成執行。

Qt D-Bus

基於D-Bus的IPC、RPC遠程調用。D-BUS在Linux中自動集成,在Windows中可自行編譯支持。

話說把這個和Qt Concurrent結合使用後,是不是就成分散式開發框架了(逃

Qt Graphical Effects

為Qt Quick提供的界面特效

Qt Image Formats

以下幾種圖像格式擴展插件介面:TIFF, MNG, TGA, WBMP

Qt Mac Extras

OS X的系統API接入

Qt Platform Headers

為各平台特有功能接入的平台信息封裝

Qt Print Support

列印支持……

Qt SVG

SVG文件處理

Qt Windows Extras

Windows系統API接入

Qt X11 Extras

X11框架API接入

Qt Quick Compiler

可以將QML編譯以提高執行效率

Qt Gamepad

遊戲手柄硬體支持……(這是要登錄主機平台么)

Qt Serial Bus

工業化串列匯流排支持,包括I/O和協議處理

Qt Wayland Compositor

Wayland的支持……

Qt SCXML

基於SCXML文件生成的狀態機功能

以下四個是Qt商業版獨佔的組件,最近的兩個版本中,以GPLv3的方式提供給開源版使用了

Qt Charts

圖表控制項。包括科學繪圖的2維,3維圖,包括word excel里幾乎一切圖表,同樣c++和qml通用

Qt Data Visualization

數據可視化組件。數據可視化的常見組件全部都有……

Qt Quick 2D Renderer

Qt Quicket的2D渲染引擎

Qt Virtual Keyboard

為Qt Quick提供的虛擬鍵盤


寫小工具還是用腳本語言吧,,比較順手。。跨平台的話,其實c++跨平台的特性並不好。。


如果你的需求僅僅是寫一些能夠跨平台的GUI小工具,為什麼不考慮Python,而是選擇「困難模式」的C++呢?


推薦閱讀:

初學QT怎麼學?
如何用 C++ 在 GUI 中畫出各種平衡樹插入刪除的動態變化?
Qt多線程編程中子線程如何調用主線程中的成員變數?
用Qt5的Qpainter畫視頻解碼的圖像,發現CPU佔用極高(50%),有方法能夠降低cpu佔用嗎?

TAG:QtC開發框架 | C | 程序員轉行 |