其實,PyQt的實際使用經(jīng)驗弧蝇,我大概也就三個月碳褒。而Qt,最多也就一個月吧看疗。所以這篇文章并不是想說Qt的編程和PyQt的編程沙峻。而是想說說我這一個多禮拜的編譯經(jīng)驗和這兩者的關系而已。(只涉及技術思路两芳,不涉及具體技術摔寨。具體技術網(wǎng)上一大堆。)
Qt怖辆,最大的好處是可移植是复。Python,最大的好處是編程更加敏捷竖螃,且也是可移植的淑廊。那PyQt,其實就是Qt的一個Python wrapper√嘏兀現(xiàn)在好多C/C++的動態(tài)庫都有Python的wapper季惩。比如我常常使用的OpenCV啦,還有同事經(jīng)常使用的OpenGL啦腻格,OpenCL啦画拾。所以目前,用C++進行底層的實現(xiàn)菜职,而提供Python的接口青抛,是比較流行的做法。女兒前段時間很喜歡看《海底小縱隊》些楣,我也跟著看了幾集脂凶。里面有一個叫巴克的北極熊和一個叫呱唧的貓宪睹。他倆經(jīng)常一起出去執(zhí)行任務,因為組合了北極熊的力量和貓的敏捷蚕钦,他倆總是能出色地完成各種考驗⊥げ。現(xiàn)在想想,如果把C++比喻成北極熊嘶居,而把Python比喻成貓罪帖,也是十分合適的。
說回Qt/PyQt的編譯∮势ǎ現(xiàn)在常用的Qt版本有Qt4和Qt5兩種整袁。目前來說還是支持Qt4的開源庫多一些。而Qt4相較于Qt5佑吝,我暫時還沒有感受到明顯的弱項坐昙。所以我電腦上的環(huán)境目前是Qt4的最高版本-4.8.11。如果是安裝Qt芋忿,在Ubuntu上可以直接用sudo apt install
來安裝Qt的開發(fā)庫炸客。在Windows上有相應的安裝程序來安裝。那PyQt呢戈钢,得看你用什么python版本痹仙。有的python版本,用pip就可以直接安裝殉了,而又的python版本开仰,就是無法直接安裝。而好死不死薪铜,由于某種原因众弓,我必須使用的python版本,用pip就是無法安裝PyQt4痕囱。這個時候就要通過源碼來編譯田轧。
上riverbankcomputing的網(wǎng)站,上面有下PyQt4鞍恢,PyQt5以及SIP的源碼傻粘。SIP,是編譯PyQt所必須使用的編譯工具帮掉。所以編譯PyQt的順序是這樣:
- 安裝好Qt弦悉。
- 保證qmake在Windows的控制臺或Ubuntu的終端上是可用的。
- 下載SIP源碼包蟆炊,安裝SIP稽莉。
- 下載PyQt源碼包,安裝涩搓。
這里比較好玩的地方在于污秆,看看Qt到PyQt到底是怎么做的劈猪。PyQt的源碼包中沒有Qt的任何原文件,只有一些sip定義的文件良拼,還有其它的一些工具軟件战得。也就是說,PyQt的具體實現(xiàn)庸推,真的就是在Qt中常侦。另外,在整個編譯過程中贬媒,并不需要對Qt本身進行修改聋亡。那SIP的做法很好啊~后來,我看了一下SIP的文檔际乘。在Introduction中坡倔,是這么說的:
SIP是一個工具,能對C/C++庫自動生成Python-bindings脖含。SIP最初是在1998年被開發(fā)出來用于PyQt——the Python bindings for the Qt GUI toolkit致讥,但是它也同樣適用于C/C++庫。
本版SIP生成的綁定適用于Python2.3及以后版本器赞,包括Python3。
還有許多跟SIP功能類似的工具墓拜。其中一個就是SWIG港柜,事實上SIP之所以被叫做SIP是起初就是一個小的SWIG。與SWIG不同的是咳榜,SIP是專門設計用于將Python和C/C++集成在一起夏醉,并不遺余力地使集成更加緊密。
其特點如下(不全涌韩,摘錄):
- 綁定能夠被快速加載畔柔,并且最大限度地減少了內存消耗,特別是在僅使用大型庫的小型子集時
- 標準Python和C/C++數(shù)據(jù)類型之間的自動轉換
- 用不同的參數(shù)簽名重載函數(shù)和方法
- 支持Python的關鍵字參數(shù)語法
- 支持明確指定的和自動生成的文檔注釋
- 能夠訪問C++類的protected方法
- 能夠定義一個Python類臣樱,它是C++類的一個子類靶擦,包括抽象的C++類
- Python子類可以實現(xiàn)__dtor __()方法,該方法將從C++類的虛擬析構函數(shù)中調用
- 支持普通的C++函數(shù)雇毫,類方法玄捕,靜態(tài)類方法,虛擬類方法和抽象類方法
- 能夠在Python中重新實現(xiàn)C++的虛擬方法和抽象方法
- 支持全局變量和類變量
- 支持全局操作符和類操作符
- 支持C++命名空間
- 支持C++模版
- 支持C++異常并以Python異常的方式捕獲它們
- 支持棄用警告
- 能夠定義C++類與相似的Python數(shù)據(jù)類型之間的映射棚放,并且是被自動調用的
- 能夠自動利用任何可用的運行時類型信息來確保Python實例對象的類匹配相應C ++實例的類
- 能夠改變Python對象的類型及元類型枚粘,用來包裝C/C++的數(shù)據(jù)類型
- 全面支持Python全局解釋器鎖定,能夠讓指定的C++函數(shù)阻塞飘蚯,允許釋放鎖定從而運行其他Python線程
- 支持C++實例所有權的概念(例如馍迄,代碼的哪一部分負責調用實例的析構函數(shù))以及在應用執(zhí)行期間所有權可能如何改變
- 能夠生成一個C++類庫的綁定福也,這個C++類庫是在另外一個已經(jīng)生成了綁定的C++類庫的基礎上建立的,因此不同的綁定能夠集成和并正確地共享代碼
- 有一個復雜的版本控制系統(tǒng)攀圈,從而允許在一組簡單的規(guī)范文件中描述C++類庫的完整生命周期暴凑,包括任何平臺特有的或者可選的特征。
- SIP 可以在 UNIX, Linux, Windows, MacOS/X, Android and iOS下使用量承。
另外搬设,看了一下Using SIP的文檔。其中比較復雜的那個例子撕捍,說明了如何使用Qt來編寫一個控件拿穴,然后把它放到PyQt的工程中。這么做是非常有意義的忧风。因為:
- 如果控件本身的邏輯比較復雜默色,用Python實現(xiàn)比較慢,那就可以用C++來實現(xiàn)狮腿,只在PyQt中調用即可腿宰。
- 萬一看到別人用C++的Qt實現(xiàn)了一個自己想用的控件,可以在幾乎不改人家的源代碼的情況下缘厢,拿過來嵌入到自己的PyQt項目中吃度。(不過有一個前提,人家用Qt4贴硫,你就得用PyQt4椿每,人家用Qt5,你就得用PyQt5)
注:官網(wǎng)提供了Qt4到PyQt4的例程英遭,github上有一個Qt5到PyQt5的例程间护。在Google搜索Qt5ToPyQt5即可。