前言
2020年12月8日 Qt 官方宣佈正式釋出 Qt 6.0(是全新 Qt 6系列的首個版本,是 Qt 的一個重要里程碑)。2020年12月10日,適用於 Qt 6的新版本 Qt for Python 官宣正式釋出了。2021年1月4日,適用於 Qt 6的新版本 PyQt6 也正式官宣釋出。
注:看來“領養的”PyQt 跟“親生的” Qt for Python 還是有所區別的啊:)
相信大家知道利用 Qt 可以開發出功能強大的、跨平臺的圖形使用者介面(GUI,Graphical User Interface)應用程式,但是 Qt 是基於 C++ 語言的 GUI 類庫,不少初學者對 C++ 語言有畏難情緒,可能簡單試試後就擱置一邊棄之不顧了,很可惜沒能堅持下去。
幸運的是,可以使用“Qt + Python”的方式來克服對 C++ 語言的恐懼(Python 語言相對於 C++ 語言要簡單、更易上手),進而透過 Python 語言開發出基於 Qt 的、功能強大的、跨平臺的 GUI 應用程式。
接下來,我將對如何在 Python 中使用 Qt for Python 進行 GUI 應用程式開發作一個系列的介紹。本文是本系列第一篇文章,首先對 Qt for Python 進行介紹,供各位 Qt for Python 的初學者們參考。
注:本系列將會以 PySide6 為例進行介紹,原則上同樣適用於 PyQt6。
1. Qt + Python 簡介1.1 概述用 Python 編寫 GUI 應用程式時,必須使用相應的 Python GUI 庫來完成。Python 語言雖然功能很強,但其自帶的 GUI 庫(Tkinter)功能相對較弱,難以開發出專業的 GUI 應用程式。
而 Qt 是一款非常優秀的跨平臺的 C++ GUI 類庫和應用程式開發框架,它體系龐大、文件齊全、介面豐富(提供包括用於圖形使用者介面、網路、執行緒、正則表示式、SQL資料庫、SVG、OpenGL、XML、使用者和應用程式設定、定位和位置服務、短距離通訊( NFC和藍芽)、網頁瀏覽、3D動畫、圖表、3D資料視覺化以及與應用商店等的 API),廣泛應用於開發功能強大的、跨平臺的、專業的 GUI 應用程式。
結合Python語言的開放性,很容易將 Qt 的 C++ GUI 類庫封裝為 Python 繫結,所以“Qt + Python”就先後有了 PyQt 和 Qt for Python。
Qt + Python
1.2 優點結合“Qt + Python”使用可以充分利用 Qt 的應用程式開發框架和功能豐富的類來設計開發 GUI 應用程式,主要有以下一些優點:
(1) 將 Qt 的跨平臺應用框架與 Python 的跨平臺解釋語言結合在一起。
(2) Qt 使用訊號與槽(Signals/Slots)機制進行物件之間的通訊,它是型別安全且弱耦合的,易於建立可重用的軟體模組。
(3) 使用 Qt Designer 工具可以視覺化地設計窗體,然後將窗體檔案轉換為 Python 程式碼檔案,可以大大提高介面設計的效率。
(4) 將 Qt 和 Python 的優點結合到一起,開發者可以利用 Qt 豐富的 UI 設計功能,但不需要掌握複雜的 C++ 語言,而是使用簡單的 Python 語言程式設計。
2. PyQt 介紹PyQt 是一種被廣泛使用的 Python GUI 庫,它是最成熟的 GUI 應用程式開發框架之一。
PyQt 提供了一組對 Qt 跨平臺應用程式工具包(C++ GUI類庫封裝)的 Python 繫結,可以 Python 模組的方式提供給開發者使用。藉助 PyQt ,Python 開發者可以很方便地建立各種美觀、複雜、功能強大的跨平臺的 GUI 應用程式。
PyQt 被實現為超過35個擴充套件模組,並使Python可以在所有受支援的平臺(如Windows,Linux,UNIX,Android,macOS和iOS平臺)上用作 C++ 語言的替代應用程式開發語言。PyQt 也可以嵌入在基於 C++ 的應用程式中,以允許那些應用程式的使用者配置或增強應用程式的功能。
PyQt 已經發展了很多年,技術比較成熟穩定,技術文件也比較豐富,具備廣泛的影響力。
PyQt 開發者是英國的“Riverbank Computing”公司。目前它提供了 GPLv3 與商業許可兩種授權方式:個人可以免費地用於開源軟體的開發,但不可以免費用於商業目的;如果想用於商業目的,則必須購買其商業許可。
PyQt 目前歷經了以下幾個主要模組的更迭:
——PyQt3 模組:可以在Python應用程式中使用 Qt 1、Qt 2、Qt 3 的API。
——PyQt4 模組:可以在Python應用程式中使用 Qt 4 的API。
——PyQt5 模組:可以在Python應用程式中使用 Qt 5 的API。
——PyQt6 模組:可以在Python應用程式中使用 Qt 6 的API。
注1:2021年1月4日 PyQt v6.0.0釋出,這是Qt v6繫結的第一個版本。PyQt6-3D v6.0.0和PyQt6-NetworkAuth v6.0.0也同時釋出。
注2:當前 Qt 1 - 4,PyQt3 和 PyQt4 模組已經不再被支援。
PyQt 是使用 SIP 繫結生成器構建的,所以必須安裝 SIP 模組才能構建和使用 PyQt。
注1:SIP 是RiverBank公司開發的用於 PyQt 的 Python/C++ 混合程式設計解決方案(將 C/C++ 庫建立為 Python 繫結的工具)。
注2:2021年1月4日 SIP v6.0.0釋出。它刪除了對 SIP v5中不推薦使用的所有功能的支援,並添加了 PyQt6 所需的新功能。它還支援 PyQt5。
PyQt 學習參考資料:
PyQt 學習參考資料
注:目前 PyQt 官網尚未提供專門的 PyQt6 參考資料,可以參考 PyQt5 的。
3. Qt for Python 簡介Qt for Python Logo
Qt for Python 專案旨在為 PySide 模組提供完整的 Qt 介面支援,這樣就可以在 Python 應用程式中使用 Qt 的 API,允許 Python 開發人員充分利用 Qt 的潛力來開發各種美觀、複雜、功能強大的跨平臺的 GUI 應用程式。
Qt for Python 提供了一組對 Qt 跨平臺應用程式和 UI 框架(C++ GUI類庫封裝)的 Python 官方繫結,包含兩個模組:
——PySide 模組:提供可在 Python 應用程式中使用 Qt 的 API。
——Shiboken 模組:附帶一個 Python 繫結生成器,可以把 C++ 專案轉換為 Python 專案。
Qt for Python 目前歷經了以下幾個主要模組的更迭:
——Pyside 模組(對標 PyQt4):可以在 Python 應用程式中使用 Qt 4.6+ 的 API。
——PySide2 模組(對標 PyQt5):可以在 Python 應用程式中使用 Qt 5.12+ 的 API。
——PySide6 模組(對標 PyQt6):可以在 Python 應用程式中使用 Qt 6 的 API。
注1:2020年12月8日 PySide v6.0.0釋出,這是 Qt v6 Python 官方繫結的第一個版本。
注2:當前 PySide 模組已經不再被支援。
Qt for Python 的開發者是“ Qt for Python Team ”。目前它提供了GPLv3、LGPLv3 與商業許可三種授權方式:個人可以免費地用於開源軟體的開發(遵循 GPL 許可);也可以免費用於商業目的(需遵循 LGPL 許可規則);如果想用於商業目的,則必須購買其商業許可。
Qt for Python 提供了與 PyQt 類似的功能,最大的區別就是在於Qt for Python 提供了 LGPL 授權,這意味著開發者可以免費用於商業。
Pyside 模組依賴於 Shiboken 模組,而 Shiboken 是一個用於將 C/C++ 庫生成基於 CPython 的繫結程式碼生成器,可以把 C++ 專案轉換為 Python 專案。
注:2020年12月8日 Shiboken v6.0.0釋出。
下圖為執行時架構:
執行時架構
下圖總結了 Shiboken 在 Qt for Python 中的作用。
Shiboken 在 Qt for Python 中的作用
Qt for Python 學習參考資料:
Qt for Python學習參考資料
4. Qt for Python 對比 PyQt本章透過對比方式來展現各版本的 Qt for Python 和 PyQt 之間的區別:
4.1 PySide6 vs PyQt6PySide6 與 PyQt6 的區別如下表所示:(最新發布,建議新學者直接上手)
PySide6 vs PyQt6
注:PySide6 相較於 PySide2,不再支援 Python 2.7, 3.5,目前版本(6.0.0)中基礎模組有大量刪減,後續版本中相關模組會陸續補充完善進來。
4.2 PySide2 vs PyQt5PySide2 與 PyQt5 的區別如下表所示:(技術穩定,文件豐富,當前應用主流)
PySide2 vs PyQt5
4.3 PySide vs PyQt4PySide 與 PyQt4 的區別如下表所示:(已經過時,不再支援)
PySide vs PyQt4
結束語本系列介紹如何在 Python 中使用 Qt for Python 進行 GUI 應用程式開發。
本文是《Qt for Python 學習筆記》系列第一篇,對 Qt for Python 進行了介紹,接下來會介紹如何搭建 PySide6 開發環境,敬請期待!