一般來說,用C++寫 Qt 應用才是正宗的,不過,為了讓小學生也能體驗 Qt 的開發過程,或者官方為了增加開發者人數,推出了可用 Python 來程式設計的 Qt 版本。此版本命名比較奇葩,叫 PySide,與 Qt 6 配套的是 PySide 6。當前最新版本是 6.3.2。
PySide 的優勢在於它是官方維護的,完全是C++開發的。在原有庫基礎上增加了對應的 .pyd 檔案,對 API 做了封裝,並由 .pyi 檔案進行型別規範。在效能上是不用擔心的,但是,這種開發方式用來學習較適合,真要做個應用程式,還是用C++好,編譯出來就能用了。Python 寫的話打包要用其他工具,也麻煩,對於指令碼語言,還得到處帶上個解析器。
PySide 6 可以通過 pip 直接安裝就行了。
在安裝之前,老周建議先建立個虛擬環境。一來專用性強,二來方便打包。假設我要把虛擬環境存放在神奇的 E 盤下的 MyEnv 目錄下,那麼,可以執行:
python -m venv E:\MyEnv
或者
python3 -m venv E:\MyEnv
虛擬環境可以建立一個隔離的區域,有獨立的 python 解析器、pip 程式等。每個虛擬環境互不干擾。在虛所環境的 Scripts 目錄(Linux是 bin 目錄)下,有兩個檔案很有用。要啟用虛擬環境,就執行 activate 檔案;要退出虛擬環境,執行 deactivate 檔案。
接下來在剛建立的虛擬環境中安裝 PySide 6。先執行 activate 檔案啟用環境,然後執行命令:
pip install PySide6
如果不能下載或下載特慢,請換國內的清華大學源。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PySide6
詳細的使用方法請自行檢視幫助說明,此話題對本文而言已超綱。
------------------------------------------------------------------------------------------------------------------------------------
接下來該到 VS Code 了。不需要什麼特殊設定,安裝微軟官方的 Python 擴充套件即可。
但是,不過,可是,然而,要注意:要先執行虛擬環境中的 activate 檔案,然後在當前執行環境不變的前提下啟動 VS Code。在VS Code中也需要使用虛擬環境所設定的環境變數。為了人性化,咱們可以在桌面上建一個批次檔,然後輸入以下內容:
@echo off call E:\MyEnv\Scripts\activate.bat start C:\<你的VS Code 路徑>\VSCode\Code.exe exit
第一行不解釋了,可自行度娘。第二行是用 CALL 命令呼叫 activate 檔案(在 Windows 上它是個批次檔),這樣虛擬環境就啟用了。第三行使用 start 命令啟動 VS Code,這樣 VS Code 就具備了虛擬環境的上下文和環境變數了。第四行退出這個批次檔,這是為了關掉命令列視窗。此處不必理會 deactivate 檔案,畢竟 VS Code 退出後,虛擬環境相關的環境變數就沒有了。
當我們要用 PySide 6 時,直接執行批次檔就完事了。
===================================================================================
PySide 6 的各種型別、模組與 C++ 版本是一樣的,只要你會寫 Python 程式碼,基本上可以直接遷移。當然,千萬不要像官方檔案那樣遷移,因為檔案的 Python 程式碼估計是通過機器翻譯的,直接將 C++ 譯成 Python。所以,你會看到官方檔案有很多 Python 程式碼是錯的,根本不能執行。有的連語法都保留了 C++ 特徵,壓根就不是 Python 程式碼。
儘管不能直接把 C++ 程式碼轉換成 Python 程式碼,但是按照 C++ Qt 程式的思路來寫程式碼是沒問題的。由於程式語言差異性,是不可能完全相容的。比如,C++ 版中的許多宏,你不能在 Python 中使用。假如你要從 QObject 類派生,為了使其支援訊號和槽,要加上 Q_OBJECT 宏。在 Python 中不需要加,也沒有這個,官方封裝的庫會幫我們完成這個。再如,C++ 中過載的運運算元 <<、>> 也不能用,PySide 中沒有 QDebug。
在 VS Code 中,解析器選擇咱們上面建立的虛擬環境。然後新建一個程式碼檔案,名字隨便取。寫個簡單程式試試。
# 匯入要用到的型別 from PySide6.QtCore import Qt from PySide6.QtWidgets import QApplication, QWidget # 自定義類,作為視窗 class MyWindow(QWidget): # 建構函式 def __init__(self, parent = None): super().__init__(parent, Qt.Window) # 設定視窗標題 self.setWindowTitle("智慧掏糞機") # 設定視窗大小 self.resize(260, 185) #------------------------------------------------- if __name__ == '__main__': # 先範例化 app 物件 app = QApplication() # 再範例化視窗類物件 win = MyWindow() # 顯示視窗 win.show() # 啟動訊息迴圈 app.exec()
最後啟動應用程式的程式碼也可以這樣寫:
if __name__ == '__main__': import sys # 先範例化 app 物件 app = QApplication(sys.argv) # 再範例化視窗類物件 win = MyWindow() # 顯示視窗 win.show() # 啟動訊息迴圈 sys.exit(app.exec())
執行此程式碼檔案,效果如下圖:
看到上述視窗,說明 PySide 6 設定無誤。